artemis.py
author Dmitriy Morozov <morozov@cs.duke.edu>
Wed, 16 Apr 2008 17:47:34 -0400
changeset 24 17a8293bbbbf
parent 21 5b3579dc7abf
child 26 4574d2d34009
permissions -rw-r--r--
Fixed various maildir-related bugs: missing subdirs, wrong keys, etc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
     1
# Author: Dmitriy Morozov <hg@foxcub.org>, 2007
19
c79f89b04676 Added vim instruction to expand tabs + number of comments aligned to preset width in ilist
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 18
diff changeset
     2
        
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
     3
"""A very simple and lightweight issue tracker for Mercurial."""
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
     4
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
     5
from mercurial import hg, util
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
     6
from mercurial.i18n import _
7
74cbd53bf7d8 Implemented basic filters functionality in ilist (fixing 8e4)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 6
diff changeset
     7
import os, time, random, mailbox, glob, socket, ConfigParser
0
c1b34481e50a Initial commit
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
     8
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
     9
5
cef66aa31468 ilist doesn't show fixed issues by default (instead of showing only new ones)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 4
diff changeset
    10
state = {'new': 'new', 'fixed': 'fixed'}
cef66aa31468 ilist doesn't show fixed issues by default (instead of showing only new ones)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 4
diff changeset
    11
state['default'] = state['new']
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    12
issues_dir = ".issues"
7
74cbd53bf7d8 Implemented basic filters functionality in ilist (fixing 8e4)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 6
diff changeset
    13
filter_prefix = ".filter"
15
e5b03298394e Fixed using Mirko Friedenhagen's observations the date bug (c56) + fixed timezones of all bugs
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 13
diff changeset
    14
date_format = '%a, %d %b %Y %H:%M:%S'
24
17a8293bbbbf Fixed various maildir-related bugs: missing subdirs, wrong keys, etc
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 21
diff changeset
    15
maildir_dirs = ['new','cur','tmp']
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    16
0
c1b34481e50a Initial commit
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    17
6
11cab5930258 Function rename + pretty list
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 5
diff changeset
    18
def ilist(ui, repo, **opts):
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    19
    """List issues associated with the project"""
1
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
    20
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    21
    # Process options
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    22
    show_all = opts['all']
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    23
    properties = []
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    24
    match_date, date_match = False, lambda x: True
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    25
    if opts['date']:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    26
        match_date, date_match = True, util.matchdate(opts['date'])
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    27
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    28
    # Find issues
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    29
    issues_path = os.path.join(repo.root, issues_dir)
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    30
    if not os.path.exists(issues_path): return
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    31
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    32
    issues = glob.glob(os.path.join(issues_path, '*'))
17
f70d7e98eb21 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 16
diff changeset
    33
24
17a8293bbbbf Fixed various maildir-related bugs: missing subdirs, wrong keys, etc
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 21
diff changeset
    34
    # Create missing dirs
17a8293bbbbf Fixed various maildir-related bugs: missing subdirs, wrong keys, etc
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 21
diff changeset
    35
    for i in issues:
17a8293bbbbf Fixed various maildir-related bugs: missing subdirs, wrong keys, etc
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 21
diff changeset
    36
        for d in maildir_dirs:
17a8293bbbbf Fixed various maildir-related bugs: missing subdirs, wrong keys, etc
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 21
diff changeset
    37
            path = os.path.join(issues_path,i,d)
17a8293bbbbf Fixed various maildir-related bugs: missing subdirs, wrong keys, etc
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 21
diff changeset
    38
            if not os.path.exists(path): os.mkdir(path)
17a8293bbbbf Fixed various maildir-related bugs: missing subdirs, wrong keys, etc
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 21
diff changeset
    39
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    40
    # Process filter
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    41
    if opts['filter']:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    42
        filters = glob.glob(os.path.join(issues_path, filter_prefix + '*'))
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    43
        config = ConfigParser.SafeConfigParser()
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    44
        config.read(filters)
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    45
        if not config.has_section(opts['filter']):
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    46
            ui.warning('No filter %s defined\n', opts['filter'])
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    47
        else:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    48
            properties += config.items(opts['filter'])
17
f70d7e98eb21 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 16
diff changeset
    49
18
57157f212cde Fix for nonworking property option in ilist.
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 17
diff changeset
    50
    properties += _get_properties(opts['property'])
17
f70d7e98eb21 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 16
diff changeset
    51
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    52
    for issue in issues:
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
    53
        mbox = mailbox.Maildir(issue, factory=mailbox.MaildirMessage)
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
    54
        root = _find_root_key(mbox)
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    55
        property_match = True
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    56
        for property,value in properties:
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
    57
            property_match = property_match and (mbox[root][property] == value)
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
    58
        if not show_all and (not properties or not property_match) and (properties or mbox[root]['State'].upper() == state['fixed'].upper()): continue
5
cef66aa31468 ilist doesn't show fixed issues by default (instead of showing only new ones)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 4
diff changeset
    59
cef66aa31468 ilist doesn't show fixed issues by default (instead of showing only new ones)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 4
diff changeset
    60
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
    61
        if match_date and not date_match(util.parsedate(mbox[root]['date'])[0]): continue
19
c79f89b04676 Added vim instruction to expand tabs + number of comments aligned to preset width in ilist
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 18
diff changeset
    62
        ui.write("%s (%3d) [%s]: %s\n" % (issue[len(issues_path)+1:], # +1 for trailing /
c79f89b04676 Added vim instruction to expand tabs + number of comments aligned to preset width in ilist
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 18
diff changeset
    63
                                          len(mbox)-1,                # number of replies (-1 for self)
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
    64
                                          mbox[root]['State'],
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
    65
                                          mbox[root]['Subject']))
17
f70d7e98eb21 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 16
diff changeset
    66
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    67
6
11cab5930258 Function rename + pretty list
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 5
diff changeset
    68
def iadd(ui, repo, id = None, comment = 0):
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    69
    """Adds a new issue, or comment to an existing issue ID or its comment COMMENT"""
17
f70d7e98eb21 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 16
diff changeset
    70
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    71
    comment = int(comment)
4
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
    72
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    73
    # First, make sure issues have a directory
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    74
    issues_path = os.path.join(repo.root, issues_dir)
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    75
    if not os.path.exists(issues_path): os.mkdir(issues_path)
4
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
    76
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    77
    if id:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    78
        issue_fn, issue_id = _find_issue(ui, repo, id)
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    79
        if not issue_fn:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    80
            ui.warn('No such issue\n')
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    81
            return
24
17a8293bbbbf Fixed various maildir-related bugs: missing subdirs, wrong keys, etc
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 21
diff changeset
    82
        for d in maildir_dirs:
17a8293bbbbf Fixed various maildir-related bugs: missing subdirs, wrong keys, etc
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 21
diff changeset
    83
            path = os.path.join(issues_path,issue_id,d)
17a8293bbbbf Fixed various maildir-related bugs: missing subdirs, wrong keys, etc
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 21
diff changeset
    84
            if not os.path.exists(path): os.mkdir(path)
17
f70d7e98eb21 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 16
diff changeset
    85
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    86
    user = ui.username()
1
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
    87
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    88
    default_issue_text  =         "From: %s\nDate: %s\n" % (user, util.datestr(format = date_format))
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    89
    if not id:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    90
        default_issue_text +=     "State: %s\n" % state['default']
24
17a8293bbbbf Fixed various maildir-related bugs: missing subdirs, wrong keys, etc
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 21
diff changeset
    91
    default_issue_text +=         "Subject: brief description\n\n"
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    92
    default_issue_text +=         "Detailed description."
1
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
    93
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    94
    issue = ui.edit(default_issue_text, user)
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    95
    if issue.strip() == '':
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    96
        ui.warn('Empty issue, ignoring\n')
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    97
        return
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    98
    if issue.strip() == default_issue_text:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    99
        ui.warn('Unchanged issue text, ignoring\n')
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   100
        return
1
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
   101
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   102
    # Create the message
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   103
    msg = mailbox.MaildirMessage(issue)
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   104
    #msg.set_from('artemis', True)
17
f70d7e98eb21 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 16
diff changeset
   105
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   106
    # Pick random filename
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   107
    if not id:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   108
        issue_fn = issues_path
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   109
        while os.path.exists(issue_fn):
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   110
            issue_id = _random_id()
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   111
            issue_fn = os.path.join(issues_path, issue_id)
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   112
    # else: issue_fn already set
1
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
   113
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   114
    # Add message to the mailbox
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   115
    mbox = mailbox.Maildir(issue_fn)
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   116
    keys = _order_keys_date(mbox)
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   117
    mbox.lock()
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   118
    if id and comment >= len(mbox):
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   119
        ui.warn('No such comment number in mailbox, commenting on the issue itself\n')
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   120
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   121
    if not id:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   122
        msg.add_header('Message-Id', "<%s-0-artemis@%s>" % (issue_id, socket.gethostname()))
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   123
    else:
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   124
        root = keys[0]
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   125
        msg.add_header('Message-Id', "<%s-%s-artemis@%s>" % (issue_id, _random_id(), socket.gethostname()))
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   126
        msg.add_header('References', mbox[(comment < len(mbox) and keys[comment]) or root]['Message-Id'])
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   127
        msg.add_header('In-Reply-To', mbox[(comment < len(mbox) and keys[comment]) or root]['Message-Id'])
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   128
    repo.add([issue_fn[(len(repo.root)+1):] + '/new/'  + mbox.add(msg)])   # +1 for the trailing /
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   129
    mbox.close()
1
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
   130
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   131
    # If adding issue, add the new mailbox to the repository
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   132
    if not id:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   133
        ui.status('Added new issue %s\n' % issue_id)
1
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
   134
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   135
6
11cab5930258 Function rename + pretty list
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 5
diff changeset
   136
def ishow(ui, repo, id, comment = 0, **opts):
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   137
    """Shows issue ID, or possibly its comment COMMENT"""
17
f70d7e98eb21 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 16
diff changeset
   138
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   139
    comment = int(comment)
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   140
    issue, id = _find_issue(ui, repo, id)
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   141
    if not issue: return
24
17a8293bbbbf Fixed various maildir-related bugs: missing subdirs, wrong keys, etc
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 21
diff changeset
   142
    
17a8293bbbbf Fixed various maildir-related bugs: missing subdirs, wrong keys, etc
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 21
diff changeset
   143
    # Create missing dirs
17a8293bbbbf Fixed various maildir-related bugs: missing subdirs, wrong keys, etc
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 21
diff changeset
   144
    for d in maildir_dirs:
17a8293bbbbf Fixed various maildir-related bugs: missing subdirs, wrong keys, etc
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 21
diff changeset
   145
        path = os.path.join(repo.root,issues_dir,issue,d)
17a8293bbbbf Fixed various maildir-related bugs: missing subdirs, wrong keys, etc
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 21
diff changeset
   146
        if not os.path.exists(path): os.mkdir(path)
17a8293bbbbf Fixed various maildir-related bugs: missing subdirs, wrong keys, etc
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 21
diff changeset
   147
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   148
    mbox = mailbox.Maildir(issue, factory=mailbox.MaildirMessage)
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   149
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   150
    if opts['all']:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   151
        ui.write('='*70 + '\n')
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   152
        i = 0
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   153
        keys = _order_keys_date(mbox) 
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   154
        for k in keys:
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   155
            _write_message(ui, mbox[k], i)
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   156
            ui.write('-'*70 + '\n')
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   157
            i += 1
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   158
        return
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   159
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   160
    _show_mbox(ui, mbox, comment)
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   161
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   162
6
11cab5930258 Function rename + pretty list
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 5
diff changeset
   163
def iupdate(ui, repo, id, **opts):
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   164
    """Update properties of issue ID"""
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   165
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   166
    issue, id = _find_issue(ui, repo, id)
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   167
    if not issue: return
24
17a8293bbbbf Fixed various maildir-related bugs: missing subdirs, wrong keys, etc
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 21
diff changeset
   168
    
17a8293bbbbf Fixed various maildir-related bugs: missing subdirs, wrong keys, etc
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 21
diff changeset
   169
    # Create missing dirs
17a8293bbbbf Fixed various maildir-related bugs: missing subdirs, wrong keys, etc
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 21
diff changeset
   170
    for d in maildir_dirs:
17a8293bbbbf Fixed various maildir-related bugs: missing subdirs, wrong keys, etc
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 21
diff changeset
   171
        path = os.path.join(repo.root,issues_dir,issue,d)
17a8293bbbbf Fixed various maildir-related bugs: missing subdirs, wrong keys, etc
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 21
diff changeset
   172
        if not os.path.exists(path): os.mkdir(path)
17a8293bbbbf Fixed various maildir-related bugs: missing subdirs, wrong keys, etc
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 21
diff changeset
   173
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   174
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   175
    properties = _get_properties(opts['property'])
17
f70d7e98eb21 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 16
diff changeset
   176
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   177
    # Read the issue
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   178
    mbox = mailbox.Maildir(issue, factory=mailbox.MaildirMessage)
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   179
    root = _find_root_key(mbox)
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   180
    msg = mbox[root]
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   181
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   182
    # Fix the properties
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   183
    properties_text = ''
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   184
    for property, value in properties:
20
1630cf85c7f7 Fixed error on changing non-existent property in iupdate
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 19
diff changeset
   185
        if property in msg:
1630cf85c7f7 Fixed error on changing non-existent property in iupdate
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 19
diff changeset
   186
            msg.replace_header(property, value)
1630cf85c7f7 Fixed error on changing non-existent property in iupdate
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 19
diff changeset
   187
        else:
1630cf85c7f7 Fixed error on changing non-existent property in iupdate
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 19
diff changeset
   188
            msg.add_header(property, value)
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   189
        properties_text += '%s=%s\n' % (property, value)
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   190
    mbox.lock()
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   191
    mbox[root] = msg
4
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   192
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   193
    # Write down a comment about updated properties
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   194
    if properties and not opts['no_property_comment']:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   195
        user = ui.username()
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   196
        properties_text  =     "From: %s\nDate: %s\nSubject: properties changes (%s)\n\n%s" % \
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   197
                            (user, util.datestr(format = date_format),
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   198
                             _pretty_list(list(set([property for property, value in properties]))),
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   199
                             properties_text)
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   200
        msg = mailbox.mboxMessage(properties_text)
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   201
        msg.add_header('Message-Id', "<%s-%s-artemis@%s>" % (id, _random_id(), socket.gethostname()))
24
17a8293bbbbf Fixed various maildir-related bugs: missing subdirs, wrong keys, etc
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 21
diff changeset
   202
        msg.add_header('References', mbox[root]['Message-Id'])
17a8293bbbbf Fixed various maildir-related bugs: missing subdirs, wrong keys, etc
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 21
diff changeset
   203
        msg.add_header('In-Reply-To', mbox[root]['Message-Id'])
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   204
        #msg.set_from('artemis', True)
24
17a8293bbbbf Fixed various maildir-related bugs: missing subdirs, wrong keys, etc
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 21
diff changeset
   205
        repo.add([issue[(len(repo.root)+1):] + '/new/'  + mbox.add(msg)])   # +1 for the trailing /
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   206
    mbox.close()
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   207
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   208
    # Show updated message
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   209
    _show_mbox(ui, mbox, 0)
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   210
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   211
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   212
def _find_issue(ui, repo, id):
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   213
    issues_path = os.path.join(repo.root, issues_dir)
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   214
    if not os.path.exists(issues_path): return False
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   215
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   216
    issues = glob.glob(os.path.join(issues_path, id + '*'))
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   217
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   218
    if len(issues) == 0:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   219
        return False, 0
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   220
    elif len(issues) > 1:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   221
        ui.status("Multiple choices:\n")
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   222
        for i in issues: ui.status('  ', i[len(issues_path)+1:], '\n')
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   223
        return False, 0
17
f70d7e98eb21 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 16
diff changeset
   224
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   225
    return issues[0], issues[0][len(issues_path)+1:]
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   226
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   227
def _get_properties(property_list):
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   228
    return [p.split('=') for p in property_list]
17
f70d7e98eb21 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 16
diff changeset
   229
4
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   230
def _write_message(ui, message, index = 0):
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   231
    if index: ui.write("Comment: %d\n" % index)
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   232
    if ui.verbose:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   233
        ui.write(message.as_string().strip() + '\n')
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   234
    else:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   235
        if 'From' in message: ui.write('From: %s\n' % message['From'])
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   236
        if 'Date' in message: ui.write('Date: %s\n' % message['Date'])
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   237
        if 'Subject' in message: ui.write('Subject: %s\n' % message['Subject'])
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   238
        if 'State' in message: ui.write('State: %s\n' % message['State'])
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   239
        ui.write('\n' + message.get_payload().strip() + '\n')
4
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   240
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   241
def _show_mbox(ui, mbox, comment):
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   242
    # Output the issue (or comment)
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   243
    if comment >= len(mbox):
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   244
        comment = 0
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   245
        ui.warn('Comment out of range, showing the issue itself\n')
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   246
    keys = _order_keys_date(mbox)
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   247
    root = keys[0]
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   248
    msg = mbox[keys[comment]]
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   249
    ui.write('='*70 + '\n')
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   250
    if comment:
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   251
        ui.write('Subject: %s\n' % mbox[root]['Subject'])
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   252
        ui.write('State: %s\n' % mbox[root]['State'])
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   253
        ui.write('-'*70 + '\n')
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   254
    _write_message(ui, msg, comment)
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   255
    ui.write('-'*70 + '\n')
4
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   256
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   257
    # Read the mailbox into the messages and children dictionaries
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   258
    messages = {}
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   259
    children = {}
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   260
    i = 0
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   261
    for k in keys:
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   262
        m = mbox[k]
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   263
        messages[m['Message-Id']] = (i,m)
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   264
        children.setdefault(m['In-Reply-To'], []).append(m['Message-Id'])
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   265
        i += 1
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   266
    children[None] = []                # Safeguard against infinte loop on empty Message-Id
4
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   267
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   268
    # Iterate over children
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   269
    id = msg['Message-Id']
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   270
    id_stack = (id in children and map(lambda x: (x, 1), reversed(children[id]))) or []
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   271
    if not id_stack: return
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   272
    ui.write('Comments:\n')
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   273
    while id_stack:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   274
        id,offset = id_stack.pop()
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   275
        id_stack += (id in children and map(lambda x: (x, offset+1), reversed(children[id]))) or []
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   276
        index, msg = messages[id]
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   277
        ui.write('  '*offset + ('%d: ' % index) + msg['Subject'] + '\n')
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   278
    ui.write('-'*70 + '\n')
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   279
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   280
def _find_root_key(maildir):
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   281
    for k,m in maildir.iteritems():
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   282
        if 'in-reply-to' not in m:
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   283
            return k
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   284
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   285
def _order_keys_date(mbox):
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   286
    keys = mbox.keys()
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   287
    root = _find_root_key(mbox)
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   288
    keys.sort(lambda k1,k2: -(k1 == root) or cmp(util.parsedate(mbox[k1]['date']), util.parsedate(mbox[k2]['date'])))
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   289
    return keys
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   290
6
11cab5930258 Function rename + pretty list
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 5
diff changeset
   291
def _pretty_list(lst):
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   292
    s = ''
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   293
    for i in lst:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   294
        s += i + ', '
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   295
    return s[:-2]
6
11cab5930258 Function rename + pretty list
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 5
diff changeset
   296
8
b1f268a9e4ed Message-Ids in <...> + randomized comment ids
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 7
diff changeset
   297
def _random_id():
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   298
    return "%x" % random.randint(2**63, 2**64-1)
8
b1f268a9e4ed Message-Ids in <...> + randomized comment ids
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 7
diff changeset
   299
0
c1b34481e50a Initial commit
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   300
c1b34481e50a Initial commit
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   301
cmdtable = {
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   302
    'ilist':    (ilist,
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   303
                 [('a', 'all', False,
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   304
                   'list all issues (by default only those with state new)'),
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   305
                  ('p', 'property', [],
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   306
                   'list issues with specific field values (e.g., -p state=fixed)'),
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   307
                  ('d', 'date', '', 'restrict to issues matching the date (e.g., -d ">12/28/2007)"'),
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   308
                  ('f', 'filter', '', 'restrict to pre-defined filter (in %s/%s*)' % (issues_dir, filter_prefix))],
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   309
                 _('hg ilist [OPTIONS]')),
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   310
    'iadd':       (iadd, 
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   311
                 [],
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   312
                 _('hg iadd [ID] [COMMENT]')),
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   313
    'ishow':      (ishow,
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   314
                 [('a', 'all', None, 'list all comments')],
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   315
                 _('hg ishow [OPTIONS] ID [COMMENT]')),
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   316
    'iupdate':    (iupdate,
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   317
                 [('p', 'property', [],
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   318
                   'update properties (e.g., -p state=fixed)'),
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   319
                  ('n', 'no-property-comment', None,
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   320
                   'do not add a comment about changed properties')],
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   321
                 _('hg iupdate [OPTIONS] ID'))
0
c1b34481e50a Initial commit
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   322
}
19
c79f89b04676 Added vim instruction to expand tabs + number of comments aligned to preset width in ilist
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 18
diff changeset
   323
c79f89b04676 Added vim instruction to expand tabs + number of comments aligned to preset width in ilist
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 18
diff changeset
   324
# vim: expandtab