comparison mercurial/osutil.c @ 5427:dae6188e8c9e

osutil: move file list loop to its own function
author Matt Mackall <mpm@selenic.com>
date Mon, 08 Oct 2007 18:47:18 -0500
parents e760cb72c02e
children eb1b6aaeb32e
comparison
equal deleted inserted replaced
5426:e760cb72c02e 5427:dae6188e8c9e
107 if (S_ISFIFO(mode)) return S_IFIFO; 107 if (S_ISFIFO(mode)) return S_IFIFO;
108 if (S_ISSOCK(mode)) return S_IFSOCK; 108 if (S_ISSOCK(mode)) return S_IFSOCK;
109 return mode; 109 return mode;
110 } 110 }
111 111
112 static PyObject *listfiles(PyObject *list, DIR *dir, int stat, int *all)
113 {
114 struct dirent *ent;
115 PyObject *name, *py_kind, *val;
116
117 for (ent = readdir(dir); ent; ent = readdir(dir)) {
118 int kind = -1;
119
120 if (!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, ".."))
121 continue;
122
123 #ifdef DT_REG
124 if (!stat)
125 switch (ent->d_type) {
126 case DT_REG: kind = S_IFREG; break;
127 case DT_DIR: kind = S_IFDIR; break;
128 case DT_LNK: kind = S_IFLNK; break;
129 case DT_BLK: kind = S_IFBLK; break;
130 case DT_CHR: kind = S_IFCHR; break;
131 case DT_FIFO: kind = S_IFIFO; break;
132 case DT_SOCK: kind = S_IFSOCK; break;
133 default:
134 *all = 0;
135 break;
136 }
137 #else
138 *all = 0;
139 #endif
140
141 if (kind != -1)
142 py_kind = PyInt_FromLong(kind);
143 else {
144 py_kind = Py_None;
145 Py_INCREF(Py_None);
146 }
147
148 val = PyTuple_New(stat ? 3 : 2);
149 name = PyString_FromString(ent->d_name);
150
151 if (!name || !py_kind || !val) {
152 Py_XDECREF(name);
153 Py_XDECREF(py_kind);
154 Py_XDECREF(val);
155 return PyErr_NoMemory();
156 }
157
158 PyTuple_SET_ITEM(val, 0, name);
159 PyTuple_SET_ITEM(val, 1, py_kind);
160 if (stat) {
161 PyTuple_SET_ITEM(val, 2, Py_None);
162 Py_INCREF(Py_None);
163 }
164
165 PyList_Append(list, val);
166 Py_DECREF(val);
167 }
168
169 return 0;
170 }
171
112 static PyObject *statfiles(PyObject *list, PyObject *ctor_args, int keep, 172 static PyObject *statfiles(PyObject *list, PyObject *ctor_args, int keep,
113 char *path, int len, DIR *dir) 173 char *path, int len, DIR *dir)
114 { 174 {
115 struct stat buf; 175 struct stat buf;
116 struct stat *stp = &buf; 176 struct stat *stp = &buf;
171 static PyObject *listdir(PyObject *self, PyObject *args, PyObject *kwargs) 231 static PyObject *listdir(PyObject *self, PyObject *args, PyObject *kwargs)
172 { 232 {
173 static char *kwlist[] = { "path", "stat", NULL }; 233 static char *kwlist[] = { "path", "stat", NULL };
174 PyObject *statobj = NULL; 234 PyObject *statobj = NULL;
175 DIR *dir = NULL; 235 DIR *dir = NULL;
176 struct dirent *ent;
177 PyObject *list = NULL; 236 PyObject *list = NULL;
178 PyObject *err = NULL; 237 PyObject *err = NULL;
179 PyObject *ctor_args = NULL; 238 PyObject *ctor_args = NULL;
180 int all_kinds = 1; 239 int all_kinds = 1;
181 char full_path[PATH_MAX + 10]; 240 char full_path[PATH_MAX + 10];
200 goto bail; 259 goto bail;
201 260
202 strncpy(full_path, path, PATH_MAX); 261 strncpy(full_path, path, PATH_MAX);
203 full_path[path_len] = '/'; 262 full_path[path_len] = '/';
204 263
205 for (ent = readdir(dir); ent; ent = readdir(dir)) { 264 err = listfiles(list, dir, do_stat, &all_kinds);
206 PyObject *name = NULL; 265 if (err)
207 PyObject *py_kind = NULL; 266 goto bail;
208 PyObject *val = NULL;
209 int kind = -1;
210
211 if (!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, ".."))
212 continue;
213
214 #ifdef DT_REG
215 if (!do_stat)
216 switch (ent->d_type) {
217 case DT_REG: kind = S_IFREG; break;
218 case DT_DIR: kind = S_IFDIR; break;
219 case DT_LNK: kind = S_IFLNK; break;
220 case DT_BLK: kind = S_IFBLK; break;
221 case DT_CHR: kind = S_IFCHR; break;
222 case DT_FIFO: kind = S_IFIFO; break;
223 case DT_SOCK: kind = S_IFSOCK; break;
224 default:
225 all_kinds = 0;
226 break;
227 }
228 #else
229 all_kinds = 0;
230 #endif
231
232 name = PyString_FromString(ent->d_name);
233 if (kind != -1)
234 py_kind = PyInt_FromLong(kind);
235 else {
236 py_kind = Py_None;
237 Py_INCREF(Py_None);
238 }
239
240 val = PyTuple_New(do_stat ? 3 : 2);
241
242 if (!name || !py_kind || !val) {
243 Py_XDECREF(name);
244 Py_XDECREF(py_kind);
245 Py_XDECREF(val);
246 goto bail;
247 }
248
249 PyTuple_SET_ITEM(val, 0, name);
250 PyTuple_SET_ITEM(val, 1, py_kind);
251 if (do_stat) {
252 PyTuple_SET_ITEM(val, 2, Py_None);
253 Py_INCREF(Py_None);
254 }
255
256 PyList_Append(list, val);
257 Py_DECREF(val);
258 }
259 267
260 PyList_Sort(list); 268 PyList_Sort(list);
261 269
262 if (do_stat) { 270 if (do_stat) {
263 ctor_args = PyTuple_New(0); 271 ctor_args = PyTuple_New(0);