From 197346fafe41332b896999b5bbdc7b1dabe57262 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Fri, 31 Oct 1997 18:38:52 +0000 Subject: [PATCH] New policy for package imports: only a directory containing __init__.py (or __init__.pyc/.pyo, whichever applies) is considered a package. All other subdirectories are left alone. Should make Konrad Hinsen happy! --- Python/import.c | 40 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/Python/import.c b/Python/import.c index 9f68c626cd2..aef73537c55 100644 --- a/Python/import.c +++ b/Python/import.c @@ -636,6 +636,8 @@ is_builtin(name) extern FILE *PyWin_FindRegisteredModule(); #endif +static int find_init_module Py_PROTO((char *)); /* Forward */ + static struct filedescr * find_module(name, path, buf, buflen, p_fp) char *name; @@ -733,8 +735,10 @@ find_module(name, path, buf, buflen, p_fp) #ifdef HAVE_STAT if (stat(buf, &statbuf) == 0) { static struct filedescr fd = {"", "", PKG_DIRECTORY}; - if (S_ISDIR(statbuf.st_mode)) - return &fd; + if (S_ISDIR(statbuf.st_mode)) { + if (find_init_module(buf)) + return &fd; + } } #else /* XXX How are you going to test for directories? */ @@ -766,6 +770,38 @@ find_module(name, path, buf, buflen, p_fp) return fdp; } +#ifdef HAVE_STAT +/* Helper to look for __init__.py or __init__.py[co] in potential package */ +static int +find_init_module(buf) + char *buf; +{ + int save_len = strlen(buf); + int i = save_len; + struct stat statbuf; + + if (save_len + 13 >= MAXPATHLEN) + return 0; + buf[i++] = SEP; + strcpy(buf+i, "__init__.py"); + if (stat(buf, &statbuf) == 0) { + buf[save_len] = '\0'; + return 1; + } + i += strlen(buf+i); + if (Py_OptimizeFlag) + strcpy(buf+i, "o"); + else + strcpy(buf+i, "c"); + if (stat(buf, &statbuf) == 0) { + buf[save_len] = '\0'; + return 1; + } + buf[save_len] = '\0'; + return 0; +} +#endif /* HAVE_STAT */ + static int init_builtin Py_PROTO((char *)); /* Forward */