Mercurial > hg
comparison mercurial/cext/parsers.c @ 48250:1730b2fceaa1
dirstate-v2: adds a flag to mark a file as modified
Right now, a files with a file system state that requires a lookup (same size,
different mtime) will requires a lookup. If the result of that lookup is a
modified files, it will remains ambiguous, requiring a lookup on the next status
run too.
To fix this, we introduce a dedicated flag in the new format. Such flag will
allow to record such file as "known modified" avoiding an extra lookup later.
As None of the associate code currently exist in the status code, we do the
minimal implementation: if we read a dirstate entry with this flag set, we make
it as "ambiguous" so that the next status code has to look it up. The same as it
would have to without this flag existing anyway.
Differential Revision: https://phab.mercurial-scm.org/D11681
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Fri, 15 Oct 2021 16:12:00 +0200 |
parents | f7fd629ffb98 |
children | 602c8e8411f5 |
comparison
equal
deleted
inserted
replaced
48249:e9faae0f445c | 48250:1730b2fceaa1 |
---|---|
137 return (self->flags & dirstate_flag_wc_tracked); | 137 return (self->flags & dirstate_flag_wc_tracked); |
138 } | 138 } |
139 | 139 |
140 static inline bool dirstate_item_c_any_tracked(dirstateItemObject *self) | 140 static inline bool dirstate_item_c_any_tracked(dirstateItemObject *self) |
141 { | 141 { |
142 const unsigned char mask = dirstate_flag_wc_tracked | | 142 const int mask = dirstate_flag_wc_tracked | dirstate_flag_p1_tracked | |
143 dirstate_flag_p1_tracked | | 143 dirstate_flag_p2_info; |
144 dirstate_flag_p2_info; | |
145 return (self->flags & mask); | 144 return (self->flags & mask); |
146 } | 145 } |
147 | 146 |
148 static inline bool dirstate_item_c_added(dirstateItemObject *self) | 147 static inline bool dirstate_item_c_added(dirstateItemObject *self) |
149 { | 148 { |
150 const unsigned char mask = | 149 const int mask = (dirstate_flag_wc_tracked | dirstate_flag_p1_tracked | |
151 (dirstate_flag_wc_tracked | dirstate_flag_p1_tracked | | 150 dirstate_flag_p2_info); |
152 dirstate_flag_p2_info); | 151 const int target = dirstate_flag_wc_tracked; |
153 const unsigned char target = dirstate_flag_wc_tracked; | |
154 return (self->flags & mask) == target; | 152 return (self->flags & mask) == target; |
155 } | 153 } |
156 | 154 |
157 static inline bool dirstate_item_c_removed(dirstateItemObject *self) | 155 static inline bool dirstate_item_c_removed(dirstateItemObject *self) |
158 { | 156 { |
235 } | 233 } |
236 } | 234 } |
237 | 235 |
238 static PyObject *dirstate_item_v2_data(dirstateItemObject *self) | 236 static PyObject *dirstate_item_v2_data(dirstateItemObject *self) |
239 { | 237 { |
240 unsigned char flags = self->flags; | 238 int flags = self->flags; |
241 int mode = dirstate_item_c_v1_mode(self); | 239 int mode = dirstate_item_c_v1_mode(self); |
242 if ((mode & S_IXUSR) != 0) { | 240 if ((mode & S_IXUSR) != 0) { |
243 flags |= dirstate_flag_mode_exec_perm; | 241 flags |= dirstate_flag_mode_exec_perm; |
244 } else { | 242 } else { |
245 flags &= ~dirstate_flag_mode_exec_perm; | 243 flags &= ~dirstate_flag_mode_exec_perm; |
247 if (S_ISLNK(mode)) { | 245 if (S_ISLNK(mode)) { |
248 flags |= dirstate_flag_mode_is_symlink; | 246 flags |= dirstate_flag_mode_is_symlink; |
249 } else { | 247 } else { |
250 flags &= ~dirstate_flag_mode_is_symlink; | 248 flags &= ~dirstate_flag_mode_is_symlink; |
251 } | 249 } |
252 return Py_BuildValue("Bii", flags, self->size, self->mtime); | 250 return Py_BuildValue("iii", flags, self->size, self->mtime); |
253 }; | 251 }; |
254 | 252 |
255 static PyObject *dirstate_item_v1_state(dirstateItemObject *self) | 253 static PyObject *dirstate_item_v1_state(dirstateItemObject *self) |
256 { | 254 { |
257 char state = dirstate_item_c_v1_state(self); | 255 char state = dirstate_item_c_v1_state(self); |
370 dirstateItemObject *t = | 368 dirstateItemObject *t = |
371 PyObject_New(dirstateItemObject, &dirstateItemType); | 369 PyObject_New(dirstateItemObject, &dirstateItemType); |
372 if (!t) { | 370 if (!t) { |
373 return NULL; | 371 return NULL; |
374 } | 372 } |
375 if (!PyArg_ParseTuple(args, "bii", &t->flags, &t->size, &t->mtime)) { | 373 if (!PyArg_ParseTuple(args, "iii", &t->flags, &t->size, &t->mtime)) { |
376 return NULL; | 374 return NULL; |
375 } | |
376 if (t->flags & dirstate_flag_expected_state_is_modified) { | |
377 t->flags &= ~(dirstate_flag_expected_state_is_modified | | |
378 dirstate_flag_has_meaningful_data | | |
379 dirstate_flag_has_file_mtime); | |
377 } | 380 } |
378 t->mode = 0; | 381 t->mode = 0; |
379 if (t->flags & dirstate_flag_has_meaningful_data) { | 382 if (t->flags & dirstate_flag_has_meaningful_data) { |
380 if (t->flags & dirstate_flag_mode_exec_perm) { | 383 if (t->flags & dirstate_flag_mode_exec_perm) { |
381 t->mode = 0755; | 384 t->mode = 0755; |