mercurial/osutil.c
changeset 5427 dae6188e8c9e
parent 5426 e760cb72c02e
child 5428 eb1b6aaeb32e
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);