~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to www/apps/fileservice/__init__.py

  • Committer: mattgiuca
  • Date: 2008-01-10 00:28:41 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:150
fileservice: Big refactor.
    No longer outputs a list of objects. Instead outputs an object, which
    maps filenames to objects. The objects NO LONGER contain a "filename"
    field.
    This is easier for the client (JavaScript) to handle, especially when
    it wants to look for ".". Also allowed a nice refactor on the server
    side.

    Internally, no longer uses map/filter. Just uses straight for loops
    which are actually a bit neater (no need for currying functions).

Show diffs side-by-side

added added

removed removed

Lines of Context:
161
161
        req.headers_out['X-IVLE-Return'] = 'Dir'
162
162
        # Start by trying to do an SVN status, so we can report file version
163
163
        # status
 
164
        listing = {}
164
165
        try:
165
166
            status_list = svnclient.status(path, recurse=False, get_all=True,
166
167
                            update=False)
167
 
            list = filter(lambda x: x != None,
168
 
                map(PysvnStatus_to_fileinfo(path), status_list))
 
168
            for status in status_list:
 
169
                filename, attrs = PysvnStatus_to_fileinfo(path, status)
 
170
                listing[filename] = attrs
169
171
        except pysvn.ClientError:
170
172
            # Presumably the directory is not under version control.
171
173
            # Fallback to just an OS file listing.
172
 
            filenames = os.listdir(path)
173
 
            list = map(file_to_fileinfo(path), filenames)
 
174
            for filename in os.listdir(path):
 
175
                listing[filename] = file_to_fileinfo(path, filename)
174
176
            # The subversion one includes "." while the OS one does not.
175
177
            # Add "." to the output, so the caller can see we are
176
178
            # unversioned.
177
 
            list.append({"filename" : ".", "isdir" : True,
178
 
                "mtime" : time.ctime(os.path.getmtime(path))})
 
179
            listing["."] = {"isdir" : True,
 
180
                "mtime" : time.ctime(os.path.getmtime(path))}
179
181
 
180
 
        req.write(cjson.encode(list))
 
182
        req.write(cjson.encode(listing))
181
183
    else:
182
184
        # It's a file. Return the file contents.
183
185
        # First get the mime type of this file
190
192
 
191
193
        req.sendfile(path)
192
194
 
193
 
def file_to_fileinfo(path):
 
195
def file_to_fileinfo(path, filename):
194
196
    """Given a filename (relative to a given path), gets all the info "ls"
195
 
    needs to display about the filename. Returns a dict mapping a number of
196
 
    fields which are returned."""
197
 
    # Note: curried so it can be used with map
198
 
    def ftf(filename):
199
 
        fullpath = os.path.join(path, filename)
200
 
        d = {"filename" : filename}
 
197
    needs to display about the filename. Returns a dict containing a number
 
198
    of fields related to the file (excluding the filename itself)."""
 
199
    fullpath = os.path.join(path, filename)
 
200
    d = {}
 
201
    file_stat = os.stat(fullpath)
 
202
    if stat.S_ISDIR(file_stat.st_mode):
 
203
        d["isdir"] = True
 
204
    else:
 
205
        d["isdir"] = False
 
206
        d["size"] = file_stat.st_size
 
207
        (type, _) = mimetypes.guess_type(filename)
 
208
        if type is None:
 
209
            type = conf.mimetypes.default_mimetype
 
210
        d["type"] = type
 
211
    d["mtime"] = time.ctime(file_stat.st_mtime)
 
212
    return d
 
213
 
 
214
def PysvnStatus_to_fileinfo(path, status):
 
215
    """Given a PysvnStatus object, gets all the info "ls"
 
216
    needs to display about the filename. Returns a pair mapping filename to
 
217
    a dict containing a number of other fields."""
 
218
    path = os.path.normcase(path)
 
219
    fullpath = status.path
 
220
    # If this is "." (the directory itself)
 
221
    if path == os.path.normcase(fullpath):
 
222
        # If this directory is unversioned, then we aren't
 
223
        # looking at any interesting files, so throw
 
224
        # an exception and default to normal OS-based listing. 
 
225
        if status.text_status == pysvn.wc_status_kind.unversioned:
 
226
            raise pysvn.ClientError
 
227
        # We actually want to return "." because we want its
 
228
        # subversion status.
 
229
        filename = "."
 
230
    else:
 
231
        filename = os.path.basename(fullpath)
 
232
    d = {}
 
233
    text_status = status.text_status
 
234
    d["svnstatus"] = str(text_status)
 
235
    try:
201
236
        file_stat = os.stat(fullpath)
202
237
        if stat.S_ISDIR(file_stat.st_mode):
203
238
            d["isdir"] = True
204
239
        else:
205
240
            d["isdir"] = False
206
241
            d["size"] = file_stat.st_size
207
 
            (type, _) = mimetypes.guess_type(filename)
 
242
            (type, _) = mimetypes.guess_type(fullpath)
208
243
            if type is None:
209
244
                type = conf.mimetypes.default_mimetype
210
245
            d["type"] = type
211
246
        d["mtime"] = time.ctime(file_stat.st_mtime)
212
 
        return d
213
 
    return ftf
214
 
 
215
 
def PysvnStatus_to_fileinfo(path):
216
 
    """Given a PysvnStatus object, gets all the info "ls"
217
 
    needs to display about the filename. Returns a dict mapping a number of
218
 
    fields which are returned.
219
 
    """
220
 
    # Note: curried so it can be used with map
221
 
    path = os.path.normcase(path)
222
 
    def ftf(status):
223
 
        fullpath = status.path
224
 
        # If this is "." (the directory itself)
225
 
        if path == os.path.normcase(fullpath):
226
 
            # If this directory is unversioned, then we aren't
227
 
            # looking at any interesting files, so throw
228
 
            # an exception and default to normal OS-based listing. 
229
 
            if status.text_status == pysvn.wc_status_kind.unversioned:
230
 
                raise pysvn.ClientError
231
 
            # We actually want to return "." because we want its
232
 
            # subversion status.
233
 
            filename = "."
234
 
        else:
235
 
            filename = os.path.basename(fullpath)
236
 
        d = {"filename" : filename}
237
 
        text_status = status.text_status
238
 
        d["svnstatus"] = str(text_status)
239
 
        try:
240
 
            file_stat = os.stat(fullpath)
241
 
            if stat.S_ISDIR(file_stat.st_mode):
242
 
                d["isdir"] = True
243
 
            else:
244
 
                d["isdir"] = False
245
 
                d["size"] = file_stat.st_size
246
 
                (type, _) = mimetypes.guess_type(fullpath)
247
 
                if type is None:
248
 
                    type = conf.mimetypes.default_mimetype
249
 
                d["type"] = type
250
 
            d["mtime"] = time.ctime(file_stat.st_mtime)
251
 
        except OSError:
252
 
            # Here if, eg, the file is missing.
253
 
            # Can't get any more information so just return d
254
 
            pass
255
 
        return d
256
 
    return ftf
257
 
 
 
247
    except OSError:
 
248
        # Here if, eg, the file is missing.
 
249
        # Can't get any more information so just return d
 
250
        pass
 
251
    return filename, d