comparison mercurial/osutil.c @ 5424:005638db9d0c

osutil: fold stat paths together - simplify st/py_st logic - use stp to point to stat buffer - combine stat paths
author Matt Mackall <mpm@selenic.com>
date Mon, 08 Oct 2007 18:47:15 -0500
parents e5f238a8b0d2
children 830f6e280c90
comparison
equal deleted inserted replaced
5423:e5f238a8b0d2 5424:005638db9d0c
221 for (i = 0; i < size; i++) { 221 for (i = 0; i < size; i++) {
222 PyObject *elt = PyList_GetItem(list, i); 222 PyObject *elt = PyList_GetItem(list, i);
223 char *name = PyString_AsString(PyTuple_GET_ITEM(elt, 0)); 223 char *name = PyString_AsString(PyTuple_GET_ITEM(elt, 0));
224 PyObject *py_st = NULL; 224 PyObject *py_st = NULL;
225 PyObject *py_kind = PyTuple_GET_ITEM(elt, 1); 225 PyObject *py_kind = PyTuple_GET_ITEM(elt, 1);
226 struct listdir_stat *st;
227 struct stat buf;
228 struct stat *stp = &buf;
226 int kind; 229 int kind;
227 230
228 kind = py_kind == Py_None ? -1 : PyInt_AsLong(py_kind); 231 kind = py_kind == Py_None ? -1 : PyInt_AsLong(py_kind);
229 232
230 if (kind != -1 && !do_stat) 233 if (kind != -1 && !do_stat)
232 235
233 strncat(full_path + path_len + 1, name, PATH_MAX - path_len); 236 strncat(full_path + path_len + 1, name, PATH_MAX - path_len);
234 full_path[PATH_MAX] = 0; 237 full_path[PATH_MAX] = 0;
235 238
236 if (do_stat) { 239 if (do_stat) {
237 struct listdir_stat *st;
238
239 if (!ctor_args) { 240 if (!ctor_args) {
240 ctor_args = PyTuple_New(0); 241 ctor_args = PyTuple_New(0);
241 if (!ctor_args) 242 if (!ctor_args)
242 goto bail; 243 goto bail;
243 } 244 }
244 245
245 st = (struct listdir_stat *) 246 py_st = PyObject_CallObject((PyObject *)&listdir_stat_type,
246 PyObject_CallObject((PyObject *)&listdir_stat_type,
247 ctor_args); 247 ctor_args);
248 248 st = (struct listdir_stat *)py_st;
249 if (!st) 249 if (!st)
250 goto bail; 250 goto bail;
251 stp = &st->st;
252 PyTuple_SET_ITEM(elt, 2, py_st);
253 }
254
251 #ifdef AT_SYMLINK_NOFOLLOW 255 #ifdef AT_SYMLINK_NOFOLLOW
252 ret = fstatat(dfd, name, &st->st, AT_SYMLINK_NOFOLLOW); 256 ret = fstatat(dfd, name, stp, AT_SYMLINK_NOFOLLOW);
253 #else 257 #else
254 ret = lstat(full_path, &st->st); 258 ret = lstat(full_path, stp);
255 #endif 259 #endif
256 if (ret == -1) { 260 if (ret == -1) {
257 list = PyErr_SetFromErrnoWithFilename(PyExc_OSError, 261 list = PyErr_SetFromErrnoWithFilename(PyExc_OSError,
258 full_path); 262 full_path);
259 goto bail; 263 goto bail;
260 } 264 }
261 if (kind == -1) 265 if (kind == -1)
262 kind = mode_to_kind(st->st.st_mode); 266 kind = mode_to_kind(stp->st_mode);
263 py_st = (PyObject *)st;
264 } else {
265 struct stat buf;
266 #ifdef AT_SYMLINK_NOFOLLOW
267 ret = fstatat(dfd, ent->d_name, &buf, AT_SYMLINK_NOFOLLOW);
268 #else
269 ret = lstat(full_path, &buf);
270 #endif
271 if (ret == -1) {
272 list = PyErr_SetFromErrnoWithFilename(PyExc_OSError,
273 full_path);
274 goto bail;
275 }
276 if (kind == -1)
277 kind = mode_to_kind(buf.st_mode);
278 }
279 267
280 if (py_kind == Py_None && kind != -1) { 268 if (py_kind == Py_None && kind != -1) {
281 py_kind = PyInt_FromLong(kind); 269 py_kind = PyInt_FromLong(kind);
282 if (!py_kind) 270 if (!py_kind)
283 goto bail; 271 goto bail;
284 Py_XDECREF(Py_None); 272 Py_XDECREF(Py_None);
285 PyTuple_SET_ITEM(elt, 1, py_kind); 273 PyTuple_SET_ITEM(elt, 1, py_kind);
286 } 274 }
287
288 if (do_stat) {
289 if (!py_st) {
290 py_st = Py_None;
291 Py_INCREF(Py_None);
292 }
293 PyTuple_SET_ITEM(elt, 2, py_st);
294 }
295 } 275 }
296 276
297 goto done; 277 goto done;
298 278
299 bail: 279 bail: