~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to loggerhead/util.py

  • Committer: Robey Pointer
  • Date: 2007-01-14 05:40:40 UTC
  • Revision ID: robey@lag.net-20070114054040-7i9lbhq992e612rq
fix up dev.cfg so that nobody will ever have to edit it, by letting the
important params be overridable in loggerhead.conf.

make start-loggerhead actually daemonize, write a pid file, and write logs
to normal log files, instead of requiring 'nohup' stuff.  ie act like a real
server.  added stop-loggerhead to do a clean shutdown.  changed the README
to clarify how it should work now.

Show diffs side-by-side

added added

removed removed

Lines of Context:
298
298
        params['start_revid'] = navigation.start_revid
299
299
        
300
300
    if navigation.prev_page_revid:
301
 
        navigation.prev_page_url = navigation.branch.url([ navigation.scan_url, navigation.prev_page_revid ], **get_context(**params))
 
301
        navigation.prev_page_url = navigation.branch.url([ navigation.scan_url, navigation.prev_page_revid ], **params)
302
302
    if navigation.next_page_revid:
303
 
        navigation.next_page_url = navigation.branch.url([ navigation.scan_url, navigation.next_page_revid ], **get_context(**params))
 
303
        navigation.next_page_url = navigation.branch.url([ navigation.scan_url, navigation.next_page_revid ], **params)
304
304
 
305
305
 
306
306
def log_exception(log):
328
328
    @decorator
329
329
    def _decorator(unbound):
330
330
        def locked(self, *args, **kw):
 
331
            #self.log.debug('-> %r lock %r', id(threading.currentThread()), debug_name)
331
332
            getattr(self, lockname).acquire()
332
333
            try:
333
334
                return unbound(self, *args, **kw)
334
335
            finally:
335
336
                getattr(self, lockname).release()
 
337
                #self.log.debug('<- %r unlock %r', id(threading.currentThread()), debug_name)
336
338
        return locked
337
339
    return _decorator
338
340
 
339
 
 
340
 
@decorator
341
 
def strip_whitespace(f):
342
 
    def _f(*a, **kw):
343
 
        out = f(*a, **kw)
344
 
        orig_len = len(out)
345
 
        out = re.sub(r'\n\s+', '\n', out)
346
 
        out = re.sub(r'[ \t]+', ' ', out)
347
 
        out = re.sub(r'\s+\n', '\n', out)
348
 
        new_len = len(out)
349
 
        log.debug('Saved %sB (%d%%) by stripping whitespace.',
350
 
                  human_size(orig_len - new_len),
351
 
                  round(100.0 - float(new_len) * 100.0 / float(orig_len)))
352
 
        return out
353
 
    return _f
354
 
 
355
 
 
356
 
# just thinking out loud here...
357
 
#
358
 
# so, when browsing around, there are 5 pieces of context, most optional:
359
 
#     - current revid
360
 
#         current location along the navigation path (while browsing)
361
 
#     - starting revid (start_revid)
362
 
#         the current beginning of navigation (navigation continues back to
363
 
#         the original revision) -- this may not be along the primary revision
364
 
#         path since the user may have navigated into a branch
365
 
#     - file_id
366
 
#         if navigating the revisions that touched a file
367
 
#     - q (query)
368
 
#         if navigating the revisions that matched a search query
369
 
#     - remember
370
 
#         a previous revision to remember for future comparisons
371
 
#
372
 
# current revid is given on the url path.  the rest are optional components
373
 
# in the url params.
374
 
#
375
 
# other transient things can be set:
376
 
#     - compare_revid
377
 
#         to compare one revision to another, on /revision only
378
 
#     - sort
379
 
#         for re-ordering an existing page by different sort
380
 
 
381
 
t_context = threading.local()
382
 
_valid = ('start_revid', 'file_id', 'q', 'remember', 'compare_revid', 'sort')
383
 
 
384
 
 
385
 
def set_context(map):
386
 
    t_context.map = dict((k, v) for (k, v) in map.iteritems() if k in _valid)
387
 
 
388
 
 
389
 
def get_context(**overrides):
390
 
    """
391
 
    return a context map that may be overriden by specific values passed in,
392
 
    but only contains keys from the list of valid context keys.
393
 
    
394
 
    if 'clear' is set, only the 'remember' context value will be added, and
395
 
    all other context will be omitted.
396
 
    """
397
 
    map = dict()
398
 
    if overrides.get('clear', False):
399
 
        map['remember'] = t_context.map.get('remember', None)
400
 
    else:
401
 
        map.update(t_context.map)
402
 
    overrides = dict((k, v) for (k, v) in overrides.iteritems() if k in _valid)
403
 
    map.update(overrides)
404
 
    return map