~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to loggerhead/util.py

  • Committer: Michael Hudson
  • Date: 2008-09-29 21:35:13 UTC
  • Revision ID: michael.hudson@canonical.com-20080929213513-ools0krfn8l9wwf0
clean up flakes and whitespace in diff_ui.py

Show diffs side-by-side

added added

removed removed

Lines of Context:
32
32
import struct
33
33
import threading
34
34
import time
35
 
import types
 
35
import sys
 
36
import os
 
37
import subprocess
36
38
 
37
39
log = logging.getLogger("loggerhead.controllers")
38
40
 
342
344
            [navigation.scan_url, next_page_revno], **params)
343
345
 
344
346
 
 
347
def directory_breadcrumbs(path, is_root, view):
 
348
    """
 
349
    Generate breadcrumb information from the directory path given
 
350
 
 
351
    The path given should be a path up to any branch that is currently being
 
352
    served
 
353
 
 
354
    Arguments:
 
355
    path -- The path to convert into breadcrumbs
 
356
    is_root -- Whether or not loggerhead is serving a branch at its root
 
357
    view -- The type of view we are showing (files, changes etc)
 
358
    """
 
359
    # Is our root directory itself a branch?
 
360
    if is_root:
 
361
        if view == 'directory':
 
362
            directory = 'files'
 
363
        breadcrumbs = [{
 
364
            'dir_name': path,
 
365
            'path': '',
 
366
            'suffix': view,
 
367
        }]
 
368
    else:
 
369
        # Create breadcrumb trail for the path leading up to the branch
 
370
        breadcrumbs = [{
 
371
            'dir_name': "(root)",
 
372
            'path': '',
 
373
            'suffix': '',
 
374
        }]
 
375
        if path != '/':
 
376
            dir_parts = path.strip('/').split('/')
 
377
            for index, dir_name in enumerate(dir_parts):
 
378
                breadcrumbs.append({
 
379
                    'dir_name': dir_name,
 
380
                    'path': '/'.join(dir_parts[:index + 1]),
 
381
                    'suffix': '',
 
382
                })
 
383
            # If we are not in the directory view, the last crumb is a branch,
 
384
            # so we need to specify a view
 
385
            if view != 'directory':
 
386
                breadcrumbs[-1]['suffix'] = '/' + view
 
387
    return breadcrumbs
 
388
 
 
389
 
 
390
def branch_breadcrumbs(path, inv, view):
 
391
    """
 
392
    Generate breadcrumb information from the branch path given
 
393
 
 
394
    The path given should be a path that exists within a branch
 
395
 
 
396
    Arguments:
 
397
    path -- The path to convert into breadcrumbs
 
398
    inv -- Inventory to get file information from
 
399
    view -- The type of view we are showing (files, changes etc)
 
400
    """
 
401
    dir_parts = path.strip('/').split('/')
 
402
    inner_breadcrumbs = []
 
403
    for index, dir_name in enumerate(dir_parts):
 
404
        inner_breadcrumbs.append({
 
405
            'dir_name': dir_name,
 
406
            'file_id': inv.path2id('/'.join(dir_parts[:index + 1])),
 
407
            'suffix': '/' + view ,
 
408
        })
 
409
    return inner_breadcrumbs
 
410
 
 
411
 
345
412
def decorator(unbound):
346
413
    def new_decorator(f):
347
414
        g = unbound(f)
445
512
    overrides = dict((k, v) for (k, v) in overrides.iteritems() if k in _valid)
446
513
    map.update(overrides)
447
514
    return map
 
515
 
 
516
 
 
517
class Reloader(object):
 
518
    """
 
519
    This class wraps all paste.reloader logic. All methods are @classmethod.
 
520
    """
 
521
 
 
522
    _reloader_environ_key = 'PYTHON_RELOADER_SHOULD_RUN'
 
523
 
 
524
    @classmethod
 
525
    def _turn_sigterm_into_systemexit(self):
 
526
        """
 
527
        Attempts to turn a SIGTERM exception into a SystemExit exception.
 
528
        """
 
529
        try:
 
530
            import signal
 
531
        except ImportError:
 
532
            return
 
533
        def handle_term(signo, frame):
 
534
            raise SystemExit
 
535
        signal.signal(signal.SIGTERM, handle_term)
 
536
 
 
537
    @classmethod
 
538
    def is_installed(self):
 
539
        return os.environ.get(self._reloader_environ_key)
 
540
    
 
541
    @classmethod
 
542
    def install(self):
 
543
        from paste import reloader
 
544
        reloader.install(int(1))
 
545
    
 
546
    @classmethod    
 
547
    def restart_with_reloader(self):
 
548
        """Based on restart_with_monitor from paste.script.serve."""
 
549
        print 'Starting subprocess with file monitor'
 
550
        while 1:
 
551
            args = [sys.executable] + sys.argv
 
552
            new_environ = os.environ.copy()
 
553
            new_environ[self._reloader_environ_key] = 'true'
 
554
            proc = None
 
555
            try:
 
556
                try:
 
557
                    self._turn_sigterm_into_systemexit()
 
558
                    proc = subprocess.Popen(args, env=new_environ)
 
559
                    exit_code = proc.wait()
 
560
                    proc = None
 
561
                except KeyboardInterrupt:
 
562
                    print '^C caught in monitor process'
 
563
                    return 1
 
564
            finally:
 
565
                if (proc is not None
 
566
                    and hasattr(os, 'kill')):
 
567
                    import signal
 
568
                    try:
 
569
                        os.kill(proc.pid, signal.SIGTERM)
 
570
                    except (OSError, IOError):
 
571
                        pass
 
572
                
 
573
            # Reloader always exits with code 3; but if we are
 
574
            # a monitor, any exit code will restart
 
575
            if exit_code != 3:
 
576
                return exit_code
 
577
            print '-'*20, 'Restarting', '-'*20