annotate mercurial/osutil.c @ 5483:0c43f87baba3 default tip

Fix file-changed-to-dir and dir-to-file commits (issue660). Allow adding to dirstate files that clash with previously existing but marked for removal. Protect from reintroducing clashes by revert. This change doesn't address related issues with update. Current workaround is to do "clean" update by manually removing conflicting files/dirs from working directory.
author Maxim Dounin <mdounin@mdounin.ru>
date Sat, 27 Oct 2007 16:27:55 +0400
parents 3b204881f959
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
1 /*
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
2 osutil.c - native operating system services
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
3
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
4 Copyright 2007 Matt Mackall and others
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
5
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
6 This software may be used and distributed according to the terms of
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
7 the GNU General Public License, incorporated herein by reference.
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
8 */
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
9
5463
3b204881f959 osutil: use fdopendir instead of dirfd
Bryan O'Sullivan <bos@serpentine.com>
parents: 5457
diff changeset
10 #define _ATFILE_SOURCE
5397
11caa374f497 osutil.c: include Python.h before the other headers
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5396
diff changeset
11 #include <Python.h>
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
12 #include <dirent.h>
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
13 #include <fcntl.h>
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
14 #include <string.h>
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
15 #include <sys/stat.h>
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
16 #include <sys/types.h>
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
17 #include <unistd.h>
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
18
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
19 struct listdir_stat {
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
20 PyObject_HEAD
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
21 struct stat st;
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
22 };
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
23
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
24 #define listdir_slot(name) \
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
25 static PyObject *listdir_stat_##name(PyObject *self, void *x) \
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
26 { \
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
27 return PyInt_FromLong(((struct listdir_stat *)self)->st.name); \
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
28 }
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
29
5431
a7c832abd29c Fix build error with Sun C compiler.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5430
diff changeset
30 listdir_slot(st_dev)
a7c832abd29c Fix build error with Sun C compiler.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5430
diff changeset
31 listdir_slot(st_mode)
a7c832abd29c Fix build error with Sun C compiler.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5430
diff changeset
32 listdir_slot(st_nlink)
a7c832abd29c Fix build error with Sun C compiler.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5430
diff changeset
33 listdir_slot(st_size)
a7c832abd29c Fix build error with Sun C compiler.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5430
diff changeset
34 listdir_slot(st_mtime)
a7c832abd29c Fix build error with Sun C compiler.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5430
diff changeset
35 listdir_slot(st_ctime)
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
36
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
37 static struct PyGetSetDef listdir_stat_getsets[] = {
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
38 {"st_dev", listdir_stat_st_dev, 0, 0, 0},
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
39 {"st_mode", listdir_stat_st_mode, 0, 0, 0},
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
40 {"st_nlink", listdir_stat_st_nlink, 0, 0, 0},
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
41 {"st_size", listdir_stat_st_size, 0, 0, 0},
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
42 {"st_mtime", listdir_stat_st_mtime, 0, 0, 0},
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
43 {"st_ctime", listdir_stat_st_ctime, 0, 0, 0},
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
44 {0, 0, 0, 0, 0}
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
45 };
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
46
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
47 static PyObject *listdir_stat_new(PyTypeObject *t, PyObject *a, PyObject *k)
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
48 {
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
49 return t->tp_alloc(t, 0);
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
50 }
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
51
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
52 static void listdir_stat_dealloc(PyObject *o)
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
53 {
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
54 o->ob_type->tp_free(o);
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
55 }
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
56
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
57 static PyTypeObject listdir_stat_type = {
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
58 PyObject_HEAD_INIT(NULL)
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
59 0, /*ob_size*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
60 "osutil.stat", /*tp_name*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
61 sizeof(struct listdir_stat), /*tp_basicsize*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
62 0, /*tp_itemsize*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
63 (destructor)listdir_stat_dealloc, /*tp_dealloc*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
64 0, /*tp_print*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
65 0, /*tp_getattr*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
66 0, /*tp_setattr*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
67 0, /*tp_compare*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
68 0, /*tp_repr*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
69 0, /*tp_as_number*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
70 0, /*tp_as_sequence*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
71 0, /*tp_as_mapping*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
72 0, /*tp_hash */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
73 0, /*tp_call*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
74 0, /*tp_str*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
75 0, /*tp_getattro*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
76 0, /*tp_setattro*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
77 0, /*tp_as_buffer*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
78 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
79 "stat objects", /* tp_doc */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
80 0, /* tp_traverse */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
81 0, /* tp_clear */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
82 0, /* tp_richcompare */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
83 0, /* tp_weaklistoffset */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
84 0, /* tp_iter */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
85 0, /* tp_iternext */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
86 0, /* tp_methods */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
87 0, /* tp_members */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
88 listdir_stat_getsets, /* tp_getset */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
89 0, /* tp_base */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
90 0, /* tp_dict */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
91 0, /* tp_descr_get */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
92 0, /* tp_descr_set */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
93 0, /* tp_dictoffset */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
94 0, /* tp_init */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
95 0, /* tp_alloc */
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
96 listdir_stat_new, /* tp_new */
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
97 };
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
98
5428
eb1b6aaeb32e osutil: more tidying
Matt Mackall <mpm@selenic.com>
parents: 5427
diff changeset
99 static PyObject *listfiles(PyObject *list, DIR *dir,
eb1b6aaeb32e osutil: more tidying
Matt Mackall <mpm@selenic.com>
parents: 5427
diff changeset
100 int keep_stat, int *need_stat)
5427
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
101 {
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
102 struct dirent *ent;
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
103 PyObject *name, *py_kind, *val;
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
104
5428
eb1b6aaeb32e osutil: more tidying
Matt Mackall <mpm@selenic.com>
parents: 5427
diff changeset
105 #ifdef DT_REG
eb1b6aaeb32e osutil: more tidying
Matt Mackall <mpm@selenic.com>
parents: 5427
diff changeset
106 *need_stat = 0;
eb1b6aaeb32e osutil: more tidying
Matt Mackall <mpm@selenic.com>
parents: 5427
diff changeset
107 #else
eb1b6aaeb32e osutil: more tidying
Matt Mackall <mpm@selenic.com>
parents: 5427
diff changeset
108 *need_stat = 1;
eb1b6aaeb32e osutil: more tidying
Matt Mackall <mpm@selenic.com>
parents: 5427
diff changeset
109 #endif
eb1b6aaeb32e osutil: more tidying
Matt Mackall <mpm@selenic.com>
parents: 5427
diff changeset
110
5427
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
111 for (ent = readdir(dir); ent; ent = readdir(dir)) {
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
112 int kind = -1;
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
113
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
114 if (!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, ".."))
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
115 continue;
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
116
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
117 #ifdef DT_REG
5428
eb1b6aaeb32e osutil: more tidying
Matt Mackall <mpm@selenic.com>
parents: 5427
diff changeset
118 if (!keep_stat)
5427
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
119 switch (ent->d_type) {
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
120 case DT_REG: kind = S_IFREG; break;
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
121 case DT_DIR: kind = S_IFDIR; break;
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
122 case DT_LNK: kind = S_IFLNK; break;
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
123 case DT_BLK: kind = S_IFBLK; break;
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
124 case DT_CHR: kind = S_IFCHR; break;
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
125 case DT_FIFO: kind = S_IFIFO; break;
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
126 case DT_SOCK: kind = S_IFSOCK; break;
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
127 default:
5428
eb1b6aaeb32e osutil: more tidying
Matt Mackall <mpm@selenic.com>
parents: 5427
diff changeset
128 *need_stat = 0;
5427
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
129 break;
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
130 }
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
131 #endif
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
132
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
133 if (kind != -1)
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
134 py_kind = PyInt_FromLong(kind);
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
135 else {
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
136 py_kind = Py_None;
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
137 Py_INCREF(Py_None);
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
138 }
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
139
5428
eb1b6aaeb32e osutil: more tidying
Matt Mackall <mpm@selenic.com>
parents: 5427
diff changeset
140 val = PyTuple_New(keep_stat ? 3 : 2);
5427
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
141 name = PyString_FromString(ent->d_name);
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
142
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
143 if (!name || !py_kind || !val) {
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
144 Py_XDECREF(name);
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
145 Py_XDECREF(py_kind);
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
146 Py_XDECREF(val);
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
147 return PyErr_NoMemory();
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
148 }
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
149
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
150 PyTuple_SET_ITEM(val, 0, name);
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
151 PyTuple_SET_ITEM(val, 1, py_kind);
5428
eb1b6aaeb32e osutil: more tidying
Matt Mackall <mpm@selenic.com>
parents: 5427
diff changeset
152 if (keep_stat) {
5427
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
153 PyTuple_SET_ITEM(val, 2, Py_None);
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
154 Py_INCREF(Py_None);
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
155 }
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
156
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
157 PyList_Append(list, val);
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
158 Py_DECREF(val);
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
159 }
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
160
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
161 return 0;
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
162 }
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
163
5425
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
164 static PyObject *statfiles(PyObject *list, PyObject *ctor_args, int keep,
5463
3b204881f959 osutil: use fdopendir instead of dirfd
Bryan O'Sullivan <bos@serpentine.com>
parents: 5457
diff changeset
165 char *path, int len, int dfd)
5425
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
166 {
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
167 struct stat buf;
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
168 struct stat *stp = &buf;
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
169 int kind;
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
170 int ret;
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
171 ssize_t i;
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
172 ssize_t size = PyList_Size(list);
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
173
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
174 for (i = 0; i < size; i++) {
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
175 PyObject *elt = PyList_GetItem(list, i);
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
176 char *name = PyString_AsString(PyTuple_GET_ITEM(elt, 0));
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
177 PyObject *py_st = NULL;
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
178 PyObject *py_kind = PyTuple_GET_ITEM(elt, 1);
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
179
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
180 kind = py_kind == Py_None ? -1 : PyInt_AsLong(py_kind);
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
181 if (kind != -1 && !keep)
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
182 continue;
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
183
5430
0bdea0abe62e osutil.c: use strncpy instead of strncat
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5428
diff changeset
184 strncpy(path + len + 1, name, PATH_MAX - len);
5425
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
185 path[PATH_MAX] = 0;
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
186
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
187 if (keep) {
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
188 py_st = PyObject_CallObject(
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
189 (PyObject *)&listdir_stat_type, ctor_args);
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
190 if (!py_st)
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
191 return PyErr_NoMemory();
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
192 stp = &((struct listdir_stat *)py_st)->st;
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
193 PyTuple_SET_ITEM(elt, 2, py_st);
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
194 }
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
195
5463
3b204881f959 osutil: use fdopendir instead of dirfd
Bryan O'Sullivan <bos@serpentine.com>
parents: 5457
diff changeset
196 #ifdef AT_SYMLINK_NOFOLLOW
3b204881f959 osutil: use fdopendir instead of dirfd
Bryan O'Sullivan <bos@serpentine.com>
parents: 5457
diff changeset
197 ret = fstatat(dfd, name, stp, AT_SYMLINK_NOFOLLOW);
3b204881f959 osutil: use fdopendir instead of dirfd
Bryan O'Sullivan <bos@serpentine.com>
parents: 5457
diff changeset
198 #else
5425
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
199 ret = lstat(path, stp);
5463
3b204881f959 osutil: use fdopendir instead of dirfd
Bryan O'Sullivan <bos@serpentine.com>
parents: 5457
diff changeset
200 #endif
5425
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
201 if (ret == -1)
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
202 return PyErr_SetFromErrnoWithFilename(PyExc_OSError,
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
203 path);
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
204
5457
7372b6bbc5e6 osutil: improve portability
Matt Mackall <mpm@selenic.com>
parents: 5432
diff changeset
205 if (kind == -1) {
7372b6bbc5e6 osutil: improve portability
Matt Mackall <mpm@selenic.com>
parents: 5432
diff changeset
206 if (S_ISREG(stp->st_mode))
7372b6bbc5e6 osutil: improve portability
Matt Mackall <mpm@selenic.com>
parents: 5432
diff changeset
207 kind = S_IFREG;
7372b6bbc5e6 osutil: improve portability
Matt Mackall <mpm@selenic.com>
parents: 5432
diff changeset
208 else if (S_ISDIR(stp->st_mode))
7372b6bbc5e6 osutil: improve portability
Matt Mackall <mpm@selenic.com>
parents: 5432
diff changeset
209 kind = S_IFDIR;
7372b6bbc5e6 osutil: improve portability
Matt Mackall <mpm@selenic.com>
parents: 5432
diff changeset
210 else if (S_ISLNK(stp->st_mode))
7372b6bbc5e6 osutil: improve portability
Matt Mackall <mpm@selenic.com>
parents: 5432
diff changeset
211 kind = S_IFLNK;
7372b6bbc5e6 osutil: improve portability
Matt Mackall <mpm@selenic.com>
parents: 5432
diff changeset
212 else if (S_ISBLK(stp->st_mode))
7372b6bbc5e6 osutil: improve portability
Matt Mackall <mpm@selenic.com>
parents: 5432
diff changeset
213 kind = S_IFBLK;
7372b6bbc5e6 osutil: improve portability
Matt Mackall <mpm@selenic.com>
parents: 5432
diff changeset
214 else if (S_ISCHR(stp->st_mode))
7372b6bbc5e6 osutil: improve portability
Matt Mackall <mpm@selenic.com>
parents: 5432
diff changeset
215 kind = S_IFCHR;
7372b6bbc5e6 osutil: improve portability
Matt Mackall <mpm@selenic.com>
parents: 5432
diff changeset
216 else if (S_ISFIFO(stp->st_mode))
7372b6bbc5e6 osutil: improve portability
Matt Mackall <mpm@selenic.com>
parents: 5432
diff changeset
217 kind = S_IFIFO;
7372b6bbc5e6 osutil: improve portability
Matt Mackall <mpm@selenic.com>
parents: 5432
diff changeset
218 else if (S_ISSOCK(stp->st_mode))
7372b6bbc5e6 osutil: improve portability
Matt Mackall <mpm@selenic.com>
parents: 5432
diff changeset
219 kind = S_IFSOCK;
7372b6bbc5e6 osutil: improve portability
Matt Mackall <mpm@selenic.com>
parents: 5432
diff changeset
220 else
7372b6bbc5e6 osutil: improve portability
Matt Mackall <mpm@selenic.com>
parents: 5432
diff changeset
221 kind = stp->st_mode;
7372b6bbc5e6 osutil: improve portability
Matt Mackall <mpm@selenic.com>
parents: 5432
diff changeset
222 }
5425
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
223
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
224 if (py_kind == Py_None && kind != -1) {
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
225 py_kind = PyInt_FromLong(kind);
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
226 if (!py_kind)
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
227 return PyErr_NoMemory();
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
228 Py_XDECREF(Py_None);
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
229 PyTuple_SET_ITEM(elt, 1, py_kind);
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
230 }
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
231 }
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
232
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
233 return 0;
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
234 }
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
235
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
236 static PyObject *listdir(PyObject *self, PyObject *args, PyObject *kwargs)
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
237 {
5416
ca890c0c3f1f osutil.c: style fix - delete trailing end-of-line spaces
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents: 5398
diff changeset
238 static char *kwlist[] = { "path", "stat", NULL };
5428
eb1b6aaeb32e osutil: more tidying
Matt Mackall <mpm@selenic.com>
parents: 5427
diff changeset
239 DIR *dir = NULL;
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
240 PyObject *statobj = NULL;
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
241 PyObject *list = NULL;
5425
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
242 PyObject *err = NULL;
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
243 PyObject *ctor_args = NULL;
5428
eb1b6aaeb32e osutil: more tidying
Matt Mackall <mpm@selenic.com>
parents: 5427
diff changeset
244 char *path;
5422
a3ba7ef98c94 osutil: eliminate alloca call
Matt Mackall <mpm@selenic.com>
parents: 5421
diff changeset
245 char full_path[PATH_MAX + 10];
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
246 int path_len;
5428
eb1b6aaeb32e osutil: more tidying
Matt Mackall <mpm@selenic.com>
parents: 5427
diff changeset
247 int need_stat, keep_stat;
5463
3b204881f959 osutil: use fdopendir instead of dirfd
Bryan O'Sullivan <bos@serpentine.com>
parents: 5457
diff changeset
248 int dfd;
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
249
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
250 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s#|O:listdir", kwlist,
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
251 &path, &path_len, &statobj))
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
252 goto bail;
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
253
5428
eb1b6aaeb32e osutil: more tidying
Matt Mackall <mpm@selenic.com>
parents: 5427
diff changeset
254 keep_stat = statobj && PyObject_IsTrue(statobj);
5416
ca890c0c3f1f osutil.c: style fix - delete trailing end-of-line spaces
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents: 5398
diff changeset
255
5463
3b204881f959 osutil: use fdopendir instead of dirfd
Bryan O'Sullivan <bos@serpentine.com>
parents: 5457
diff changeset
256 #ifdef AT_SYMLINK_NOFOLLOW
3b204881f959 osutil: use fdopendir instead of dirfd
Bryan O'Sullivan <bos@serpentine.com>
parents: 5457
diff changeset
257 dfd = open(path, O_RDONLY);
3b204881f959 osutil: use fdopendir instead of dirfd
Bryan O'Sullivan <bos@serpentine.com>
parents: 5457
diff changeset
258 dir = fdopendir(dfd);
3b204881f959 osutil: use fdopendir instead of dirfd
Bryan O'Sullivan <bos@serpentine.com>
parents: 5457
diff changeset
259 #else
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
260 dir = opendir(path);
5463
3b204881f959 osutil: use fdopendir instead of dirfd
Bryan O'Sullivan <bos@serpentine.com>
parents: 5457
diff changeset
261 dfd = -1;
3b204881f959 osutil: use fdopendir instead of dirfd
Bryan O'Sullivan <bos@serpentine.com>
parents: 5457
diff changeset
262 #endif
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
263 if (!dir) {
5428
eb1b6aaeb32e osutil: more tidying
Matt Mackall <mpm@selenic.com>
parents: 5427
diff changeset
264 err = PyErr_SetFromErrnoWithFilename(PyExc_OSError, path);
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
265 goto bail;
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
266 }
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
267
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
268 list = PyList_New(0);
5428
eb1b6aaeb32e osutil: more tidying
Matt Mackall <mpm@selenic.com>
parents: 5427
diff changeset
269 ctor_args = PyTuple_New(0);
eb1b6aaeb32e osutil: more tidying
Matt Mackall <mpm@selenic.com>
parents: 5427
diff changeset
270 if (!list || !ctor_args)
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
271 goto bail;
5416
ca890c0c3f1f osutil.c: style fix - delete trailing end-of-line spaces
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents: 5398
diff changeset
272
5422
a3ba7ef98c94 osutil: eliminate alloca call
Matt Mackall <mpm@selenic.com>
parents: 5421
diff changeset
273 strncpy(full_path, path, PATH_MAX);
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
274 full_path[path_len] = '/';
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
275
5428
eb1b6aaeb32e osutil: more tidying
Matt Mackall <mpm@selenic.com>
parents: 5427
diff changeset
276 err = listfiles(list, dir, keep_stat, &need_stat);
5427
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
277 if (err)
dae6188e8c9e osutil: move file list loop to its own function
Matt Mackall <mpm@selenic.com>
parents: 5426
diff changeset
278 goto bail;
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
279
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
280 PyList_Sort(list);
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
281
5428
eb1b6aaeb32e osutil: more tidying
Matt Mackall <mpm@selenic.com>
parents: 5427
diff changeset
282 if (!keep_stat && !need_stat)
eb1b6aaeb32e osutil: more tidying
Matt Mackall <mpm@selenic.com>
parents: 5427
diff changeset
283 goto done;
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
284
5463
3b204881f959 osutil: use fdopendir instead of dirfd
Bryan O'Sullivan <bos@serpentine.com>
parents: 5457
diff changeset
285 err = statfiles(list, ctor_args, keep_stat, full_path, path_len, dfd);
5428
eb1b6aaeb32e osutil: more tidying
Matt Mackall <mpm@selenic.com>
parents: 5427
diff changeset
286 if (!err)
eb1b6aaeb32e osutil: more tidying
Matt Mackall <mpm@selenic.com>
parents: 5427
diff changeset
287 goto done;
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
288
5423
e5f238a8b0d2 osutil: more cleanups
Matt Mackall <mpm@selenic.com>
parents: 5422
diff changeset
289 bail:
e5f238a8b0d2 osutil: more cleanups
Matt Mackall <mpm@selenic.com>
parents: 5422
diff changeset
290 Py_XDECREF(list);
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
291
5423
e5f238a8b0d2 osutil: more cleanups
Matt Mackall <mpm@selenic.com>
parents: 5422
diff changeset
292 done:
e5f238a8b0d2 osutil: more cleanups
Matt Mackall <mpm@selenic.com>
parents: 5422
diff changeset
293 Py_XDECREF(ctor_args);
e5f238a8b0d2 osutil: more cleanups
Matt Mackall <mpm@selenic.com>
parents: 5422
diff changeset
294 if (dir)
e5f238a8b0d2 osutil: more cleanups
Matt Mackall <mpm@selenic.com>
parents: 5422
diff changeset
295 closedir(dir);
5425
830f6e280c90 osutils: pull file stat loop into its own function
Matt Mackall <mpm@selenic.com>
parents: 5424
diff changeset
296 return err ? err : list;
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
297 }
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
298
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
299
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
300 static char osutil_doc[] = "Native operating system services.";
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
301
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
302 static PyMethodDef methods[] = {
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
303 {"listdir", (PyCFunction)listdir, METH_VARARGS | METH_KEYWORDS,
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
304 "list a directory\n"},
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
305 {NULL, NULL}
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
306 };
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
307
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
308 PyMODINIT_FUNC initosutil(void)
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
309 {
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
310 if (PyType_Ready(&listdir_stat_type) == -1)
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
311 return;
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
312
5421
9b5d626be8ba osutil: cleanups
Matt Mackall <mpm@selenic.com>
parents: 5416
diff changeset
313 Py_InitModule3("osutil", methods, osutil_doc);
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
314 }