Mercurial > hg
comparison mercurial/osutil.c @ 5423:e5f238a8b0d2
osutil: more cleanups
- eliminate a level of nesting
- untab targets of gotos
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Mon, 08 Oct 2007 18:47:14 -0500 |
parents | a3ba7ef98c94 |
children | 005638db9d0c |
comparison
equal
deleted
inserted
replaced
5422:a3ba7ef98c94 | 5423:e5f238a8b0d2 |
---|---|
213 size = PyList_Size(list); | 213 size = PyList_Size(list); |
214 #ifdef AT_SYMLINK_NOFOLLOW | 214 #ifdef AT_SYMLINK_NOFOLLOW |
215 dfd = dirfd(dir); | 215 dfd = dirfd(dir); |
216 #endif | 216 #endif |
217 | 217 |
218 if (do_stat || !all_kinds) { | 218 if (!(do_stat || !all_kinds)) |
219 for (i = 0; i < size; i++) { | 219 goto done; |
220 PyObject *elt = PyList_GetItem(list, i); | 220 |
221 char *name = PyString_AsString(PyTuple_GET_ITEM(elt, 0)); | 221 for (i = 0; i < size; i++) { |
222 PyObject *py_st = NULL; | 222 PyObject *elt = PyList_GetItem(list, i); |
223 PyObject *py_kind = PyTuple_GET_ITEM(elt, 1); | 223 char *name = PyString_AsString(PyTuple_GET_ITEM(elt, 0)); |
224 int kind; | 224 PyObject *py_st = NULL; |
225 | 225 PyObject *py_kind = PyTuple_GET_ITEM(elt, 1); |
226 kind = py_kind == Py_None ? -1 : PyInt_AsLong(py_kind); | 226 int kind; |
227 | 227 |
228 if (kind != -1 && !do_stat) | 228 kind = py_kind == Py_None ? -1 : PyInt_AsLong(py_kind); |
229 continue; | 229 |
230 | 230 if (kind != -1 && !do_stat) |
231 strncat(full_path + path_len + 1, name, | 231 continue; |
232 PATH_MAX - path_len); | 232 |
233 full_path[PATH_MAX] = 0; | 233 strncat(full_path + path_len + 1, name, PATH_MAX - path_len); |
234 | 234 full_path[PATH_MAX] = 0; |
235 if (do_stat) { | 235 |
236 struct listdir_stat *st; | 236 if (do_stat) { |
237 | 237 struct listdir_stat *st; |
238 if (!ctor_args) { | 238 |
239 ctor_args = PyTuple_New(0); | 239 if (!ctor_args) { |
240 if (!ctor_args) | 240 ctor_args = PyTuple_New(0); |
241 goto bail; | 241 if (!ctor_args) |
242 } | |
243 | |
244 st = (struct listdir_stat *) | |
245 PyObject_CallObject((PyObject *)&listdir_stat_type, | |
246 ctor_args); | |
247 | |
248 if (!st) | |
249 goto bail; | 242 goto bail; |
243 } | |
244 | |
245 st = (struct listdir_stat *) | |
246 PyObject_CallObject((PyObject *)&listdir_stat_type, | |
247 ctor_args); | |
248 | |
249 if (!st) | |
250 goto bail; | |
250 #ifdef AT_SYMLINK_NOFOLLOW | 251 #ifdef AT_SYMLINK_NOFOLLOW |
251 ret = fstatat(dfd, name, &st->st, AT_SYMLINK_NOFOLLOW); | 252 ret = fstatat(dfd, name, &st->st, AT_SYMLINK_NOFOLLOW); |
252 #else | 253 #else |
253 ret = lstat(full_path, &st->st); | 254 ret = lstat(full_path, &st->st); |
254 #endif | 255 #endif |
255 if (ret == -1) { | 256 if (ret == -1) { |
256 list = PyErr_SetFromErrnoWithFilename(PyExc_OSError, | 257 list = PyErr_SetFromErrnoWithFilename(PyExc_OSError, |
257 full_path); | 258 full_path); |
258 goto bail; | 259 goto bail; |
259 } | 260 } |
260 if (kind == -1) | 261 if (kind == -1) |
261 kind = mode_to_kind(st->st.st_mode); | 262 kind = mode_to_kind(st->st.st_mode); |
262 py_st = (PyObject *)st; | 263 py_st = (PyObject *)st; |
263 } else { | 264 } else { |
264 struct stat buf; | 265 struct stat buf; |
265 #ifdef AT_SYMLINK_NOFOLLOW | 266 #ifdef AT_SYMLINK_NOFOLLOW |
266 ret = fstatat(dfd, ent->d_name, &buf, AT_SYMLINK_NOFOLLOW); | 267 ret = fstatat(dfd, ent->d_name, &buf, AT_SYMLINK_NOFOLLOW); |
267 #else | 268 #else |
268 ret = lstat(full_path, &buf); | 269 ret = lstat(full_path, &buf); |
269 #endif | 270 #endif |
270 if (ret == -1) { | 271 if (ret == -1) { |
271 list = PyErr_SetFromErrnoWithFilename(PyExc_OSError, | 272 list = PyErr_SetFromErrnoWithFilename(PyExc_OSError, |
272 full_path); | 273 full_path); |
273 goto bail; | 274 goto bail; |
274 } | |
275 if (kind == -1) | |
276 kind = mode_to_kind(buf.st_mode); | |
277 } | 275 } |
278 | 276 if (kind == -1) |
279 if (py_kind == Py_None && kind != -1) { | 277 kind = mode_to_kind(buf.st_mode); |
280 py_kind = PyInt_FromLong(kind); | 278 } |
281 if (!py_kind) | 279 |
282 goto bail; | 280 if (py_kind == Py_None && kind != -1) { |
283 Py_XDECREF(Py_None); | 281 py_kind = PyInt_FromLong(kind); |
284 PyTuple_SET_ITEM(elt, 1, py_kind); | 282 if (!py_kind) |
283 goto bail; | |
284 Py_XDECREF(Py_None); | |
285 PyTuple_SET_ITEM(elt, 1, py_kind); | |
286 } | |
287 | |
288 if (do_stat) { | |
289 if (!py_st) { | |
290 py_st = Py_None; | |
291 Py_INCREF(Py_None); | |
285 } | 292 } |
286 | 293 PyTuple_SET_ITEM(elt, 2, py_st); |
287 if (do_stat) { | |
288 if (!py_st) { | |
289 py_st = Py_None; | |
290 Py_INCREF(Py_None); | |
291 } | |
292 PyTuple_SET_ITEM(elt, 2, py_st); | |
293 } | |
294 } | 294 } |
295 } | 295 } |
296 | 296 |
297 goto done; | 297 goto done; |
298 | 298 |
299 bail: | 299 bail: |
300 Py_XDECREF(list); | 300 Py_XDECREF(list); |
301 | 301 |
302 done: | 302 done: |
303 Py_XDECREF(ctor_args); | 303 Py_XDECREF(ctor_args); |
304 if (dir) | 304 if (dir) |
305 closedir(dir); | 305 closedir(dir); |
306 return list; | 306 return list; |
307 } | 307 } |
308 | 308 |
309 | 309 |
310 static char osutil_doc[] = "Native operating system services."; | 310 static char osutil_doc[] = "Native operating system services."; |