Rev 3706: Review feedback. in http://people.ubuntu.com/~robertc/baz2.0/readdir
Robert Collins
robertc at robertcollins.net
Wed Sep 24 00:28:33 BST 2008
At http://people.ubuntu.com/~robertc/baz2.0/readdir
------------------------------------------------------------
revno: 3706
revision-id: robertc at robertcollins.net-20080923232827-vpd4xsif8x8op6i3
parent: robertc at robertcollins.net-20080923230253-uckcf2d6z3dw1kni
committer: Robert Collins <robertc at robertcollins.net>
branch nick: readdir
timestamp: Wed 2008-09-24 09:28:27 +1000
message:
Review feedback.
modified:
.bzrignore bzrignore-20050311232317-81f7b71efa2db11a
bzrlib/_readdir_py.py readdir.py-20060609152855-rm6v321vuaqyh9tu-3
bzrlib/_readdir_pyx.pyx readdir.pyx-20060609152855-rm6v321vuaqyh9tu-1
bzrlib/_walkdirs_win32.pyx _walkdirs_win32.pyx-20080716220454-kweh3tgxez5dvw2l-2
bzrlib/osutils.py osutils.py-20050309040759-eeaff12fbf77ac86
setup.py setup.py-20050314065409-02f8a0a6e3f9bc70
=== modified file '.bzrignore'
--- a/.bzrignore 2008-09-03 06:31:11 +0000
+++ b/.bzrignore 2008-09-23 23:28:27 +0000
@@ -47,8 +47,8 @@
doc/en/developer-guide/HACKING.txt
doc/en/user-reference/bzr_man.txt
# built extension modules
-bzrlib/_*_c.dll
-bzrlib/_*_c.so
-bzrlib/_*_c.pyd
+bzrlib/_*.dll
+bzrlib/_*.so
+bzrlib/_*.pyd
# generated help topics
doc/en/user-reference/*.txt
=== modified file 'bzrlib/_readdir_py.py'
--- a/bzrlib/_readdir_py.py 2008-09-10 07:42:59 +0000
+++ b/bzrlib/_readdir_py.py 2008-09-23 23:28:27 +0000
@@ -44,7 +44,7 @@
def _kind_from_mode(stat_mode, _formats=_formats, _unknown='unknown'):
"""Generate a file kind from a stat mode. This is used in walkdirs.
- Its performance is critical: Do not mutate without careful benchmarking.
+ It's performance is critical: Do not mutate without careful benchmarking.
"""
try:
return _formats[stat_mode & 0170000]
=== modified file 'bzrlib/_readdir_pyx.pyx'
--- a/bzrlib/_readdir_pyx.pyx 2008-09-13 04:39:02 +0000
+++ b/bzrlib/_readdir_pyx.pyx 2008-09-23 23:28:27 +0000
@@ -37,12 +37,21 @@
void *malloc(int)
void free(void *)
+
+cdef extern from 'sys/types.h':
+ ctypedef long ssize_t
+ ctypedef unsigned long size_t
+ ctypedef long time_t
+ ctypedef unsigned long ino_t
+ ctypedef unsigned long long off_t
+
+
cdef extern from 'sys/stat.h':
cdef struct stat:
int st_mode
- int st_size
+ off_t st_size
int st_dev
- int st_ino
+ ino_t st_ino
int st_mtime
int st_ctime
int lstat(char *path, stat *buf)
@@ -55,13 +64,6 @@
int S_ISSOCK(int mode)
-cdef extern from 'sys/types.h':
- ctypedef long ssize_t
- ctypedef unsigned long size_t
- ctypedef long time_t
- ctypedef unsigned long ino_t
-
-
cdef extern from 'Python.h':
char * PyString_AS_STRING(object)
ctypedef int Py_ssize_t # Required for older pyrex versions
@@ -168,7 +170,7 @@
return self._kind_from_mode(mode)
cdef _kind_from_mode(self, int mode):
- # in order of frequency:
+ # Files and directories are the most common - check them first.
if S_ISREG(mode):
return self._file
if S_ISDIR(mode):
@@ -224,7 +226,8 @@
for index from 0 <= index < length:
atuple = PyList_GetItem_object_void(result, index)
name = <object>PyTuple_GetItem_void_void(atuple, 1)
- # We have inode, name, None, statvalue, None
+ # We have a tuple with (inode, name, None, statvalue, None)
+ # Now edit it:
# inode -> path_from_top
# direct concat - faster than operator +.
new_val_obj = <PyObject *>relprefix
@@ -235,12 +238,13 @@
# at it?
raise Exception("failed to strcat")
PyTuple_SetItem_obj(atuple, 0, new_val_obj)
- # None -> kind
+ # 1st None -> kind
newval = self._kind_from_mode(
(<_Stat>PyTuple_GetItem_void_void(atuple, 3)).st_mode)
Py_INCREF(newval)
PyTuple_SetItem(atuple, 2, newval)
- # none -> abspath # perhaps only do if its a dir?
+ # 2nd None -> abspath # for all - the caller may need to stat files
+ # etc.
# direct concat - faster than operator +.
new_val_obj = <PyObject *>top_slash
Py_INCREF(top_slash)
@@ -257,7 +261,9 @@
"""Like os.listdir, this reads the contents of a directory.
:param path: the directory to list.
- :return: a list of (sort_key, basename) tuples.
+ :return: a list of single-owner (the list) tuples ready for editing into
+ the result tuples walkdirs needs to yield. They contain (inode, name,
+ None, statvalue, None).
"""
cdef DIR *the_dir
# currently this needs a fixup - the C code says 'dirent' but should say
=== modified file 'bzrlib/_walkdirs_win32.pyx'
--- a/bzrlib/_walkdirs_win32.pyx 2008-09-09 16:13:37 +0000
+++ b/bzrlib/_walkdirs_win32.pyx 2008-09-23 23:28:27 +0000
@@ -71,7 +71,7 @@
import operator
import stat
-from bzrlib import osutils
+from bzrlib import osutils, _readdir_py
cdef class _Win32Stat:
@@ -158,8 +158,8 @@
cdef object _file_kind
def __init__(self):
- self._directory_kind = osutils._directory_kind
- self._file_kind = osutils._formats[stat.S_IFREG]
+ self._directory_kind = _readdir_py._directory
+ self._file_kind = _readdir_py._file
def top_prefix_to_starting_dir(self, top, prefix=""):
"""See DirReader.top_prefix_to_starting_dir."""
=== modified file 'bzrlib/osutils.py'
--- a/bzrlib/osutils.py 2008-09-23 23:02:53 +0000
+++ b/bzrlib/osutils.py 2008-09-23 23:28:27 +0000
@@ -1219,7 +1219,7 @@
:param prefix: A utf8 prefix to be preprended to the path basenames.
:param top: A natively encoded path to read.
- :return: A sorted list of the directories contents. Each item contains:
+ :return: A list of the directories contents. Each item contains:
(utf8_relpath, utf8_name, kind, lstatvalue, native_abspath)
"""
raise NotImplementedError(self.read_dir)
@@ -1565,7 +1565,7 @@
file_kind_from_stat_mode = UTF8DirReader().kind_from_mode
except ImportError:
from bzrlib._readdir_py import (
- _kind_from_mode as _file_kind_from_stat_mode
+ _kind_from_mode as file_kind_from_stat_mode
)
return file_kind_from_stat_mode(mode)
file_kind_from_stat_mode = file_kind_from_stat_mode_thunk
=== modified file 'setup.py'
--- a/setup.py 2008-09-04 12:03:01 +0000
+++ b/setup.py 2008-09-23 23:28:27 +0000
@@ -228,13 +228,14 @@
add_pyrex_extension('bzrlib._btree_serializer_c')
add_pyrex_extension('bzrlib._dirstate_helpers_c')
add_pyrex_extension('bzrlib._knit_load_data_c')
-add_pyrex_extension('bzrlib._readdir_pyx')
if sys.platform == 'win32':
# pyrex uses the macro WIN32 to detect the platform, even though it should
# be using something like _WIN32 or MS_WINDOWS, oh well, we can give it the
# right value.
add_pyrex_extension('bzrlib._walkdirs_win32',
define_macros=[('WIN32', None)])
+else:
+ add_pyrex_extension('bzrlib._readdir_pyx')
ext_modules.append(Extension('bzrlib._patiencediff_c', ['bzrlib/_patiencediff_c.c']))
More information about the bazaar-commits
mailing list