artemis.py
author Andrey Vlasovskikh <andrey.vlasovskikh@gmail.com>
Sat, 28 Nov 2009 01:28:58 +0300
changeset 41 6ac81157f063
parent 40 d013e9b9aba7
child 48 7897c850150f
permissions -rw-r--r--
merge
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
28
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
     1
# Author: Dmitriy Morozov <hg@foxcub.org>, 2007 -- 2009
38
83910efdbb54 remove trailing whitespaces
Alexander Solovyov <piranha@piranha.org.ua>
parents: 33
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
26
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
     8
import mimetypes
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
     9
from email import encoders
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
    10
from email.generator import Generator
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
    11
from email.mime.audio import MIMEAudio
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
    12
from email.mime.base import MIMEBase
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
    13
from email.mime.image import MIMEImage
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
    14
from email.mime.multipart import MIMEMultipart
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
    15
from email.mime.text import MIMEText
0
c1b34481e50a Initial commit
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    16
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    17
28
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
    18
state = {'new': 'new', 'fixed': ['fixed', 'resolved']}
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
    19
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
    20
issues_dir = ".issues"
7
74cbd53bf7d8 Implemented basic filters functionality in ilist (fixing 8e4)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 6
diff changeset
    21
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
    22
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
    23
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
    24
0
c1b34481e50a Initial commit
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    25
6
11cab5930258 Function rename + pretty list
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 5
diff changeset
    26
def ilist(ui, repo, **opts):
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    27
    """List issues associated with the project"""
1
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
    28
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    29
    # Process options
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    30
    show_all = opts['all']
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    31
    properties = []
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    32
    match_date, date_match = False, lambda x: True
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    33
    if opts['date']:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    34
        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
    35
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    36
    # Find issues
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    37
    issues_path = os.path.join(repo.root, issues_dir)
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    38
    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
    39
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    40
    issues = glob.glob(os.path.join(issues_path, '*'))
17
f70d7e98eb21 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 16
diff changeset
    41
26
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
    42
    _create_all_missing_dirs(issues_path, issues)
24
17a8293bbbbf Fixed various maildir-related bugs: missing subdirs, wrong keys, etc
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 21
diff changeset
    43
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    44
    # Process filter
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    45
    if opts['filter']:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    46
        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
    47
        config = ConfigParser.SafeConfigParser()
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    48
        config.read(filters)
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    49
        if not config.has_section(opts['filter']):
33
4b1f56527f08 Added README + fixed a bug with non-existent filters
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 32
diff changeset
    50
            ui.write('No filter %s defined\n' % opts['filter'])
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    51
        else:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    52
            properties += config.items(opts['filter'])
17
f70d7e98eb21 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 16
diff changeset
    53
31
bffaaa5c8c9b Added ability to list all possible values for a property + list issues with an unset property
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 30
diff changeset
    54
    cmd_properties = _get_properties(opts['property'])
bffaaa5c8c9b Added ability to list all possible values for a property + list issues with an unset property
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 30
diff changeset
    55
    list_properties = [p[0] for p in cmd_properties if len(p) == 1]
bffaaa5c8c9b Added ability to list all possible values for a property + list issues with an unset property
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 30
diff changeset
    56
    list_properties_dict = {}
bffaaa5c8c9b Added ability to list all possible values for a property + list issues with an unset property
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 30
diff changeset
    57
    properties += filter(lambda p: len(p) > 1, cmd_properties)
17
f70d7e98eb21 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 16
diff changeset
    58
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    59
    for issue in issues:
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
    60
        mbox = mailbox.Maildir(issue, factory=mailbox.MaildirMessage)
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
    61
        root = _find_root_key(mbox)
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    62
        property_match = True
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    63
        for property,value in properties:
31
bffaaa5c8c9b Added ability to list all possible values for a property + list issues with an unset property
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 30
diff changeset
    64
            if value:
bffaaa5c8c9b Added ability to list all possible values for a property + list issues with an unset property
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 30
diff changeset
    65
                property_match = property_match and (mbox[root][property] == value)
bffaaa5c8c9b Added ability to list all possible values for a property + list issues with an unset property
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 30
diff changeset
    66
            else:
bffaaa5c8c9b Added ability to list all possible values for a property + list issues with an unset property
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 30
diff changeset
    67
                property_match = property_match and (property not in mbox[root])
38
83910efdbb54 remove trailing whitespaces
Alexander Solovyov <piranha@piranha.org.ua>
parents: 33
diff changeset
    68
28
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
    69
        if not show_all and (not properties or not property_match) and (properties or mbox[root]['State'].upper() in [f.upper() for f in state['fixed']]): continue
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
    70
        if match_date and not date_match(util.parsedate(mbox[root]['date'])[0]): continue
31
bffaaa5c8c9b Added ability to list all possible values for a property + list issues with an unset property
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 30
diff changeset
    71
bffaaa5c8c9b Added ability to list all possible values for a property + list issues with an unset property
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 30
diff changeset
    72
        if not list_properties:
bffaaa5c8c9b Added ability to list all possible values for a property + list issues with an unset property
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 30
diff changeset
    73
            ui.write("%s (%3d) [%s]: %s\n" % (issue[len(issues_path)+1:], # +1 for trailing /
bffaaa5c8c9b Added ability to list all possible values for a property + list issues with an unset property
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 30
diff changeset
    74
                                              len(mbox)-1,                # number of replies (-1 for self)
bffaaa5c8c9b Added ability to list all possible values for a property + list issues with an unset property
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 30
diff changeset
    75
                                              _status_msg(mbox[root]),
bffaaa5c8c9b Added ability to list all possible values for a property + list issues with an unset property
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 30
diff changeset
    76
                                              mbox[root]['Subject']))
bffaaa5c8c9b Added ability to list all possible values for a property + list issues with an unset property
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 30
diff changeset
    77
        else:
bffaaa5c8c9b Added ability to list all possible values for a property + list issues with an unset property
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 30
diff changeset
    78
            for lp in list_properties:
bffaaa5c8c9b Added ability to list all possible values for a property + list issues with an unset property
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 30
diff changeset
    79
                if lp in mbox[root]:    list_properties_dict.setdefault(lp, set()).add(mbox[root][lp])
bffaaa5c8c9b Added ability to list all possible values for a property + list issues with an unset property
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 30
diff changeset
    80
bffaaa5c8c9b Added ability to list all possible values for a property + list issues with an unset property
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 30
diff changeset
    81
    if list_properties:
bffaaa5c8c9b Added ability to list all possible values for a property + list issues with an unset property
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 30
diff changeset
    82
        for lp in list_properties_dict.keys():
bffaaa5c8c9b Added ability to list all possible values for a property + list issues with an unset property
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 30
diff changeset
    83
            ui.write("%s:\n" % lp)
bffaaa5c8c9b Added ability to list all possible values for a property + list issues with an unset property
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 30
diff changeset
    84
            for value in sorted(list_properties_dict[lp]):
bffaaa5c8c9b Added ability to list all possible values for a property + list issues with an unset property
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 30
diff changeset
    85
                ui.write("  %s\n" % value)
17
f70d7e98eb21 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 16
diff changeset
    86
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    87
26
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
    88
def iadd(ui, repo, id = None, comment = 0, **opts):
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    89
    """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
    90
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    91
    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
    92
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    93
    # First, make sure issues have a directory
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    94
    issues_path = os.path.join(repo.root, issues_dir)
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    95
    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
    96
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    97
    if id:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    98
        issue_fn, issue_id = _find_issue(ui, repo, id)
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    99
        if not issue_fn:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   100
            ui.warn('No such issue\n')
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   101
            return
26
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   102
        _create_missing_dirs(issues_path, issue_id)
17
f70d7e98eb21 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 16
diff changeset
   103
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   104
    user = ui.username()
1
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
   105
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   106
    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
   107
    if not id:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   108
        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
   109
    default_issue_text +=         "Subject: brief description\n\n"
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   110
    default_issue_text +=         "Detailed description."
1
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
   111
28
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   112
    # Get properties, and figure out if we need an explicit comment
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   113
    properties = _get_properties(opts['property'])
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   114
    no_comment = id and properties and opts['no_property_comment']
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   115
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   116
    # Create the text
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   117
    if not no_comment:
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   118
        issue = ui.edit(default_issue_text, user)
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   119
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   120
        if issue.strip() == '':
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   121
            ui.warn('Empty issue, ignoring\n')
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   122
            return
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   123
        if issue.strip() == default_issue_text:
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   124
            ui.warn('Unchanged issue text, ignoring\n')
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   125
            return
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   126
    else:
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   127
        # Write down a comment about updated properties
38
83910efdbb54 remove trailing whitespaces
Alexander Solovyov <piranha@piranha.org.ua>
parents: 33
diff changeset
   128
        properties_subject = ', '.join(['%s=%s' % (property, value) for (property, value) in properties])
83910efdbb54 remove trailing whitespaces
Alexander Solovyov <piranha@piranha.org.ua>
parents: 33
diff changeset
   129
28
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   130
        issue =     "From: %s\nDate: %s\nSubject: changed properties (%s)\n" % \
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   131
                     (user, util.datestr(format = date_format), properties_subject)
1
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
   132
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   133
    # Create the message
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   134
    msg = mailbox.MaildirMessage(issue)
26
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   135
    if opts['attach']:
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   136
        outer = _attach_files(msg, opts['attach'])
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   137
    else:
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   138
        outer = msg
17
f70d7e98eb21 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 16
diff changeset
   139
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   140
    # Pick random filename
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   141
    if not id:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   142
        issue_fn = issues_path
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   143
        while os.path.exists(issue_fn):
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   144
            issue_id = _random_id()
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   145
            issue_fn = os.path.join(issues_path, issue_id)
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   146
    # else: issue_fn already set
1
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
   147
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   148
    # Add message to the mailbox
28
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   149
    mbox = mailbox.Maildir(issue_fn, factory=mailbox.MaildirMessage)
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   150
    keys = _order_keys_date(mbox)
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   151
    mbox.lock()
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   152
    if id and comment >= len(mbox):
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   153
        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
   154
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   155
    if not id:
26
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   156
        outer.add_header('Message-Id', "<%s-0-artemis@%s>" % (issue_id, socket.gethostname()))
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   157
    else:
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   158
        root = keys[0]
26
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   159
        outer.add_header('Message-Id', "<%s-%s-artemis@%s>" % (issue_id, _random_id(), socket.gethostname()))
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   160
        outer.add_header('References', mbox[(comment < len(mbox) and keys[comment]) or root]['Message-Id'])
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   161
        outer.add_header('In-Reply-To', mbox[(comment < len(mbox) and keys[comment]) or root]['Message-Id'])
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   162
    repo.add([issue_fn[(len(repo.root)+1):] + '/new/'  + mbox.add(outer)])   # +1 for the trailing /
28
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   163
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   164
    # Fix properties in the root message
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   165
    if properties:
30
b93ab358f2fc Fixed small iadd bug + added documentation issue (#d913)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 29
diff changeset
   166
        root = _find_root_key(mbox)
b93ab358f2fc Fixed small iadd bug + added documentation issue (#d913)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 29
diff changeset
   167
        msg = mbox[root]
28
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   168
        for property, value in properties:
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   169
            if property in msg:
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   170
                msg.replace_header(property, value)
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   171
            else:
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   172
                msg.add_header(property, value)
30
b93ab358f2fc Fixed small iadd bug + added documentation issue (#d913)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 29
diff changeset
   173
        mbox[root] = msg
28
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   174
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   175
    mbox.close()
1
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
   176
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   177
    # 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
   178
    if not id:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   179
        ui.status('Added new issue %s\n' % issue_id)
28
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   180
    else:
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   181
        _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
   182
6
11cab5930258 Function rename + pretty list
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 5
diff changeset
   183
def ishow(ui, repo, id, comment = 0, **opts):
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   184
    """Shows issue ID, or possibly its comment COMMENT"""
17
f70d7e98eb21 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 16
diff changeset
   185
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   186
    comment = int(comment)
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   187
    issue, id = _find_issue(ui, repo, id)
40
d013e9b9aba7 ishow: add --mutt option to display issue with mutt
Alexander Solovyov <piranha@piranha.org.ua>
parents: 38
diff changeset
   188
    if not issue:
d013e9b9aba7 ishow: add --mutt option to display issue with mutt
Alexander Solovyov <piranha@piranha.org.ua>
parents: 38
diff changeset
   189
        return ui.warn('No such issue\n')
38
83910efdbb54 remove trailing whitespaces
Alexander Solovyov <piranha@piranha.org.ua>
parents: 33
diff changeset
   190
26
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   191
    _create_missing_dirs(os.path.join(repo.root, issues_dir), issue)
24
17a8293bbbbf Fixed various maildir-related bugs: missing subdirs, wrong keys, etc
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 21
diff changeset
   192
40
d013e9b9aba7 ishow: add --mutt option to display issue with mutt
Alexander Solovyov <piranha@piranha.org.ua>
parents: 38
diff changeset
   193
    if opts.get('mutt'):
d013e9b9aba7 ishow: add --mutt option to display issue with mutt
Alexander Solovyov <piranha@piranha.org.ua>
parents: 38
diff changeset
   194
        return util.system('mutt -R -f %s' % issue)
d013e9b9aba7 ishow: add --mutt option to display issue with mutt
Alexander Solovyov <piranha@piranha.org.ua>
parents: 38
diff changeset
   195
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   196
    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
   197
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   198
    if opts['all']:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   199
        ui.write('='*70 + '\n')
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   200
        i = 0
38
83910efdbb54 remove trailing whitespaces
Alexander Solovyov <piranha@piranha.org.ua>
parents: 33
diff changeset
   201
        keys = _order_keys_date(mbox)
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   202
        for k in keys:
32
090ed3ae4c0a Added ability to skip lines starting with a string when showing a message
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 31
diff changeset
   203
            _write_message(ui, mbox[k], i, skip = opts['skip'])
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   204
            ui.write('-'*70 + '\n')
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   205
            i += 1
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   206
        return
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   207
32
090ed3ae4c0a Added ability to skip lines starting with a string when showing a message
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 31
diff changeset
   208
    _show_mbox(ui, mbox, comment, skip = opts['skip'])
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   209
26
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   210
    if opts['extract']:
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   211
        attachment_numbers = map(int, opts['extract'])
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   212
        keys = _order_keys_date(mbox)
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   213
        msg = mbox[keys[comment]]
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   214
        counter = 1
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   215
        for part in msg.walk():
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   216
            ctype = part.get_content_type()
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   217
            maintype, subtype = ctype.split('/', 1)
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   218
            if maintype == 'multipart' or ctype == 'text/plain': continue
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   219
            if counter in attachment_numbers:
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   220
                filename = part.get_filename()
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   221
                if not filename:
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   222
                    ext = mimetypes.guess_extension(part.get_content_type()) or ''
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   223
                    filename = 'attachment-%03d%s' % (counter, ext)
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   224
                fp = open(filename, 'wb')
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   225
                fp.write(part.get_payload(decode = True))
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   226
                fp.close()
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   227
            counter += 1
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   228
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   229
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   230
def _find_issue(ui, repo, id):
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   231
    issues_path = os.path.join(repo.root, issues_dir)
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   232
    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
   233
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   234
    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
   235
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   236
    if len(issues) == 0:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   237
        return False, 0
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   238
    elif len(issues) > 1:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   239
        ui.status("Multiple choices:\n")
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   240
        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
   241
        return False, 0
17
f70d7e98eb21 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 16
diff changeset
   242
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   243
    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
   244
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   245
def _get_properties(property_list):
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   246
    return [p.split('=') for p in property_list]
17
f70d7e98eb21 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 16
diff changeset
   247
32
090ed3ae4c0a Added ability to skip lines starting with a string when showing a message
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 31
diff changeset
   248
def _write_message(ui, message, index = 0, skip = None):
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   249
    if index: ui.write("Comment: %d\n" % index)
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   250
    if ui.verbose:
32
090ed3ae4c0a Added ability to skip lines starting with a string when showing a message
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 31
diff changeset
   251
        _show_text(ui, message.as_string().strip(), skip)
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   252
    else:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   253
        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
   254
        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
   255
        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
   256
        if 'State' in message: ui.write('State: %s\n' % message['State'])
26
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   257
        counter = 1
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   258
        for part in message.walk():
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   259
            ctype = part.get_content_type()
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   260
            maintype, subtype = ctype.split('/', 1)
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   261
            if maintype == 'multipart': continue
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   262
            if ctype == 'text/plain':
32
090ed3ae4c0a Added ability to skip lines starting with a string when showing a message
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 31
diff changeset
   263
                ui.write('\n')
090ed3ae4c0a Added ability to skip lines starting with a string when showing a message
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 31
diff changeset
   264
                _show_text(ui, part.get_payload().strip(), skip)
26
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   265
            else:
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   266
                filename = part.get_filename()
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   267
                ui.write('\n' + '%d: Attachment [%s, %s]: %s' % (counter, ctype, _humanreadable(len(part.get_payload())), filename) + '\n')
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   268
                counter += 1
4
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   269
32
090ed3ae4c0a Added ability to skip lines starting with a string when showing a message
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 31
diff changeset
   270
def _show_text(ui, text, skip = None):
090ed3ae4c0a Added ability to skip lines starting with a string when showing a message
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 31
diff changeset
   271
    for line in text.splitlines():
090ed3ae4c0a Added ability to skip lines starting with a string when showing a message
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 31
diff changeset
   272
        if not skip or not line.startswith(skip):
090ed3ae4c0a Added ability to skip lines starting with a string when showing a message
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 31
diff changeset
   273
            ui.write(line + '\n')
090ed3ae4c0a Added ability to skip lines starting with a string when showing a message
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 31
diff changeset
   274
    ui.write('\n')
090ed3ae4c0a Added ability to skip lines starting with a string when showing a message
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 31
diff changeset
   275
090ed3ae4c0a Added ability to skip lines starting with a string when showing a message
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 31
diff changeset
   276
def _show_mbox(ui, mbox, comment, **opts):
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   277
    # Output the issue (or comment)
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   278
    if comment >= len(mbox):
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   279
        comment = 0
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   280
        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
   281
    keys = _order_keys_date(mbox)
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   282
    root = keys[0]
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   283
    msg = mbox[keys[comment]]
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   284
    ui.write('='*70 + '\n')
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   285
    if comment:
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   286
        ui.write('Subject: %s\n' % mbox[root]['Subject'])
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   287
        ui.write('State: %s\n' % mbox[root]['State'])
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   288
        ui.write('-'*70 + '\n')
32
090ed3ae4c0a Added ability to skip lines starting with a string when showing a message
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 31
diff changeset
   289
    _write_message(ui, msg, comment, skip = ('skip' in opts) and opts['skip'])
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   290
    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
   291
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   292
    # Read the mailbox into the messages and children dictionaries
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   293
    messages = {}
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   294
    children = {}
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   295
    i = 0
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   296
    for k in keys:
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   297
        m = mbox[k]
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   298
        messages[m['Message-Id']] = (i,m)
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   299
        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
   300
        i += 1
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   301
    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
   302
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   303
    # Iterate over children
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   304
    id = msg['Message-Id']
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   305
    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
   306
    if not id_stack: return
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   307
    ui.write('Comments:\n')
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   308
    while id_stack:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   309
        id,offset = id_stack.pop()
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   310
        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
   311
        index, msg = messages[id]
29
0b3edabb7da2 Touched up ishow ("From" in the message thread + clarifed extract option)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 28
diff changeset
   312
        ui.write('  '*offset + '%d: [%s] %s\n' % (index, util.shortuser(msg['From']), msg['Subject']))
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   313
    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
   314
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   315
def _find_root_key(maildir):
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   316
    for k,m in maildir.iteritems():
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   317
        if 'in-reply-to' not in m:
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   318
            return k
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   319
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   320
def _order_keys_date(mbox):
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   321
    keys = mbox.keys()
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   322
    root = _find_root_key(mbox)
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   323
    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
   324
    return keys
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   325
8
b1f268a9e4ed Message-Ids in <...> + randomized comment ids
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 7
diff changeset
   326
def _random_id():
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   327
    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
   328
26
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   329
def _create_missing_dirs(issues_path, issue):
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   330
    for d in maildir_dirs:
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   331
        path = os.path.join(issues_path,issue,d)
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   332
        if not os.path.exists(path): os.mkdir(path)
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   333
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   334
def _create_all_missing_dirs(issues_path, issues):
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   335
    for i in issues:
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   336
        _create_missing_dirs(issues_path, i)
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   337
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   338
def _humanreadable(size):
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   339
    if size > 1024*1024:
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   340
        return '%5.1fM' % (float(size) / (1024*1024))
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   341
    elif size > 1024:
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   342
        return '%5.1fK' % (float(size) / 1024)
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   343
    else:
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   344
        return '%dB' % size
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   345
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   346
def _attach_files(msg, filenames):
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   347
    outer = MIMEMultipart()
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   348
    for k in msg.keys(): outer[k] = msg[k]
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   349
    outer.attach(MIMEText(msg.get_payload()))
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   350
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   351
    for filename in filenames:
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   352
        ctype, encoding = mimetypes.guess_type(filename)
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   353
        if ctype is None or encoding is not None:
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   354
            # No guess could be made, or the file is encoded (compressed), so
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   355
            # use a generic bag-of-bits type.
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   356
            ctype = 'application/octet-stream'
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   357
        maintype, subtype = ctype.split('/', 1)
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   358
        if maintype == 'text':
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   359
            fp = open(filename)
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   360
            # Note: we should handle calculating the charset
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   361
            attachment = MIMEText(fp.read(), _subtype=subtype)
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   362
            fp.close()
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   363
        elif maintype == 'image':
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   364
            fp = open(filename, 'rb')
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   365
            attachment = MIMEImage(fp.read(), _subtype=subtype)
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   366
            fp.close()
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   367
        elif maintype == 'audio':
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   368
            fp = open(filename, 'rb')
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   369
            attachment = MIMEAudio(fp.read(), _subtype=subtype)
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   370
            fp.close()
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   371
        else:
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   372
            fp = open(filename, 'rb')
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   373
            attachment = MIMEBase(maintype, subtype)
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   374
            attachment.set_payload(fp.read())
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   375
            fp.close()
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   376
            # Encode the payload using Base64
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   377
            encoders.encode_base64(attachment)
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   378
        # Set the filename parameter
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   379
        attachment.add_header('Content-Disposition', 'attachment', filename=filename)
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   380
        outer.attach(attachment)
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   381
    return outer
0
c1b34481e50a Initial commit
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   382
28
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   383
def _status_msg(msg):
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   384
    if msg['State'] == 'resolved':
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   385
        return 'resolved=' + msg['resolution']
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   386
    else:
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   387
        return msg['State']
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   388
0
c1b34481e50a Initial commit
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   389
cmdtable = {
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   390
    'ilist':    (ilist,
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   391
                 [('a', 'all', False,
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   392
                   '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
   393
                  ('p', 'property', [],
31
bffaaa5c8c9b Added ability to list all possible values for a property + list issues with an unset property
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 30
diff changeset
   394
                   'list issues with specific field values (e.g., -p state=fixed); lists all possible values of a property if no = sign'),
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   395
                  ('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
   396
                  ('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
   397
                 _('hg ilist [OPTIONS]')),
38
83910efdbb54 remove trailing whitespaces
Alexander Solovyov <piranha@piranha.org.ua>
parents: 33
diff changeset
   398
    'iadd':       (iadd,
26
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   399
                 [('a', 'attach', [],
28
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   400
                   'attach file(s) (e.g., -a filename1 -a filename2)'),
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   401
                  ('p', 'property', [],
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   402
                   'update properties (e.g., -p state=fixed)'),
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   403
                  ('n', 'no-property-comment', None,
38
83910efdbb54 remove trailing whitespaces
Alexander Solovyov <piranha@piranha.org.ua>
parents: 33
diff changeset
   404
                   'do not add a comment about changed properties')],
28
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   405
                 _('hg iadd [OPTIONS] [ID] [COMMENT]')),
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   406
    'ishow':      (ishow,
26
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   407
                 [('a', 'all', None, 'list all comments'),
32
090ed3ae4c0a Added ability to skip lines starting with a string when showing a message
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 31
diff changeset
   408
                  ('s', 'skip', '>', 'skip lines starting with a substring'),
40
d013e9b9aba7 ishow: add --mutt option to display issue with mutt
Alexander Solovyov <piranha@piranha.org.ua>
parents: 38
diff changeset
   409
                  ('x', 'extract', [], 'extract attachments (provide attachment number as argument)'),
d013e9b9aba7 ishow: add --mutt option to display issue with mutt
Alexander Solovyov <piranha@piranha.org.ua>
parents: 38
diff changeset
   410
                  ('', 'mutt', False, 'use mutt to show issue')],
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   411
                 _('hg ishow [OPTIONS] ID [COMMENT]')),
0
c1b34481e50a Initial commit
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   412
}
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
   413
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
   414
# vim: expandtab