artemis/artemis.py
author Dmitriy Morozov <dmitriy@mrzv.org>
Fri, 15 Apr 2011 23:10:12 -0700
changeset 62 c933fa2cd204
parent 61 artemis.py@18da6a9fa7b8
child 63 c384fa42f8a2
permissions -rw-r--r--
Moved everything into artemis/ subdirectory to be able to import termcolor.py
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
54
bd974d9e58a2 Fixed an issue that would raise an exception when using hg 1.7
Jason <jason@zzq.org>
parents: 50
diff changeset
     5
from mercurial import hg, util, commands
2
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
60
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
    17
from    termcolor       import colored
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
    18
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    19
61
18da6a9fa7b8 Added #c25 (state annotations)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 60
diff changeset
    20
state = { 'new':   ['new'],
18da6a9fa7b8 Added #c25 (state annotations)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 60
diff changeset
    21
          'fixed': ['fixed', 'resolved'] }
18da6a9fa7b8 Added #c25 (state annotations)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 60
diff changeset
    22
annotation = { 'resolved': 'resolution' }
18da6a9fa7b8 Added #c25 (state annotations)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 60
diff changeset
    23
default_state = 'new'
35
2e7575352ef3 Added configuration option to provide an alternative path for the issues directory
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 33
diff changeset
    24
default_issues_dir = ".issues"
7
74cbd53bf7d8 Implemented basic filters functionality in ilist (fixing 8e4)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 6
diff changeset
    25
filter_prefix = ".filter"
50
10fa939a4a3e Fixed #fcd (timezone)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 49
diff changeset
    26
date_format = '%a, %d %b %Y %H:%M:%S %1%2'
24
17a8293bbbbf Fixed various maildir-related bugs: missing subdirs, wrong keys, etc
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 21
diff changeset
    27
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
    28
0
c1b34481e50a Initial commit
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    29
6
11cab5930258 Function rename + pretty list
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 5
diff changeset
    30
def ilist(ui, repo, **opts):
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    31
    """List issues associated with the project"""
1
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
    32
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    33
    # Process options
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    34
    show_all = opts['all']
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    35
    properties = []
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    36
    match_date, date_match = False, lambda x: True
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    37
    if opts['date']:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    38
        match_date, date_match = True, util.matchdate(opts['date'])
59
6c388fe11dcc ilist: added --order to sort by date (fixes #82a)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 56
diff changeset
    39
    order = 'new'
6c388fe11dcc ilist: added --order to sort by date (fixes #82a)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 56
diff changeset
    40
    if opts['order']:
6c388fe11dcc ilist: added --order to sort by date (fixes #82a)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 56
diff changeset
    41
        order = opts['order']
6c388fe11dcc ilist: added --order to sort by date (fixes #82a)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 56
diff changeset
    42
60
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
    43
    # Colors
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
    44
    colors = _read_colors(ui)
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    45
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    46
    # Find issues
35
2e7575352ef3 Added configuration option to provide an alternative path for the issues directory
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 33
diff changeset
    47
    issues_dir = ui.config('artemis', 'issues', default = default_issues_dir)
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    48
    issues_path = os.path.join(repo.root, issues_dir)
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    49
    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
    50
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    51
    issues = glob.glob(os.path.join(issues_path, '*'))
17
f70d7e98eb21 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 16
diff changeset
    52
26
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
    53
    _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
    54
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    55
    # Process filter
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    56
    if opts['filter']:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    57
        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
    58
        config = ConfigParser.SafeConfigParser()
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    59
        config.read(filters)
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    60
        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
    61
            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
    62
        else:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    63
            properties += config.items(opts['filter'])
17
f70d7e98eb21 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 16
diff changeset
    64
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
    65
    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
    66
    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
    67
    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
    68
    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
    69
60
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
    70
    summaries = []
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    71
    for issue in issues:
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
    72
        mbox = mailbox.Maildir(issue, factory=mailbox.MaildirMessage)
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
    73
        root = _find_root_key(mbox)
56
0b2722bb35c9 Fixed cf0 (exception on empty Maildir in ilist)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 55
diff changeset
    74
        if not root: continue
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    75
        property_match = True
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
    76
        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
    77
            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
    78
                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
    79
            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
    80
                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
    81
28
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
    82
        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
    83
        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
    84
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
        if not list_properties:
60
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
    86
            summaries.append((_summary_line(mbox, root, issue[len(issues_path)+1:], colors),     # +1 for trailing /
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
    87
                              _find_mbox_date(mbox, root, order)))
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
    88
        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
    89
            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
    90
                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
    91
59
6c388fe11dcc ilist: added --order to sort by date (fixes #82a)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 56
diff changeset
    92
    if not list_properties:
60
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
    93
        summaries.sort(lambda (s1,d1),(s2,d2): cmp(d2,d1))
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
    94
        for s,d in summaries:
59
6c388fe11dcc ilist: added --order to sort by date (fixes #82a)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 56
diff changeset
    95
            ui.write(s)
6c388fe11dcc ilist: added --order to sort by date (fixes #82a)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 56
diff changeset
    96
    else:
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
    97
        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
    98
            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
    99
            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
   100
                ui.write("  %s\n" % value)
17
f70d7e98eb21 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 16
diff changeset
   101
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   102
26
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   103
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
   104
    """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
   105
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   106
    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
   107
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   108
    # First, make sure issues have a directory
35
2e7575352ef3 Added configuration option to provide an alternative path for the issues directory
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 33
diff changeset
   109
    issues_dir = ui.config('artemis', 'issues', default = default_issues_dir)
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   110
    issues_path = os.path.join(repo.root, issues_dir)
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   111
    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
   112
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   113
    if id:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   114
        issue_fn, issue_id = _find_issue(ui, repo, id)
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   115
        if not issue_fn:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   116
            ui.warn('No such issue\n')
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   117
            return
26
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   118
        _create_missing_dirs(issues_path, issue_id)
17
f70d7e98eb21 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 16
diff changeset
   119
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   120
    user = ui.username()
1
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
   121
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   122
    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
   123
    if not id:
61
18da6a9fa7b8 Added #c25 (state annotations)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 60
diff changeset
   124
        default_issue_text +=     "State: %s\n" % default_state
24
17a8293bbbbf Fixed various maildir-related bugs: missing subdirs, wrong keys, etc
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 21
diff changeset
   125
    default_issue_text +=         "Subject: brief description\n\n"
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   126
    default_issue_text +=         "Detailed description."
1
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
   127
28
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   128
    # 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
   129
    properties = _get_properties(opts['property'])
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   130
    no_comment = id and properties and opts['no_property_comment']
48
7897c850150f iadd: Added --message
Andrey Vlasovskikh <andrey.vlasovskikh@gmail.com>
parents: 40
diff changeset
   131
    message = opts['message']
28
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   132
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   133
    # Create the text
48
7897c850150f iadd: Added --message
Andrey Vlasovskikh <andrey.vlasovskikh@gmail.com>
parents: 40
diff changeset
   134
    if message:
7897c850150f iadd: Added --message
Andrey Vlasovskikh <andrey.vlasovskikh@gmail.com>
parents: 40
diff changeset
   135
        if not id:
61
18da6a9fa7b8 Added #c25 (state annotations)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 60
diff changeset
   136
            state_str = 'State: %s\n' % default_state
48
7897c850150f iadd: Added --message
Andrey Vlasovskikh <andrey.vlasovskikh@gmail.com>
parents: 40
diff changeset
   137
        else:
7897c850150f iadd: Added --message
Andrey Vlasovskikh <andrey.vlasovskikh@gmail.com>
parents: 40
diff changeset
   138
            state_str = ''
7897c850150f iadd: Added --message
Andrey Vlasovskikh <andrey.vlasovskikh@gmail.com>
parents: 40
diff changeset
   139
        issue = "From: %s\nDate: %s\nSubject: %s\n%s" % \
7897c850150f iadd: Added --message
Andrey Vlasovskikh <andrey.vlasovskikh@gmail.com>
parents: 40
diff changeset
   140
                (user, util.datestr(format=date_format), message, state_str)
7897c850150f iadd: Added --message
Andrey Vlasovskikh <andrey.vlasovskikh@gmail.com>
parents: 40
diff changeset
   141
    elif not no_comment:
28
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   142
        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
   143
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   144
        if issue.strip() == '':
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   145
            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
   146
            return
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   147
        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
   148
            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
   149
            return
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   150
    else:
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   151
        # Write down a comment about updated properties
38
83910efdbb54 remove trailing whitespaces
Alexander Solovyov <piranha@piranha.org.ua>
parents: 33
diff changeset
   152
        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
   153
28
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   154
        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
   155
                     (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
   156
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   157
    # Create the message
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   158
    msg = mailbox.MaildirMessage(issue)
26
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   159
    if opts['attach']:
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   160
        outer = _attach_files(msg, opts['attach'])
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   161
    else:
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   162
        outer = msg
17
f70d7e98eb21 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 16
diff changeset
   163
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   164
    # Pick random filename
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   165
    if not id:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   166
        issue_fn = issues_path
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   167
        while os.path.exists(issue_fn):
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   168
            issue_id = _random_id()
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   169
            issue_fn = os.path.join(issues_path, issue_id)
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   170
    # else: issue_fn already set
1
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
   171
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   172
    # 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
   173
    mbox = mailbox.Maildir(issue_fn, factory=mailbox.MaildirMessage)
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   174
    keys = _order_keys_date(mbox)
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   175
    mbox.lock()
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   176
    if id and comment >= len(mbox):
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   177
        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
   178
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   179
    if not id:
26
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   180
        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
   181
    else:
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   182
        root = keys[0]
26
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   183
        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
   184
        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
   185
        outer.add_header('In-Reply-To', mbox[(comment < len(mbox) and keys[comment]) or root]['Message-Id'])
54
bd974d9e58a2 Fixed an issue that would raise an exception when using hg 1.7
Jason <jason@zzq.org>
parents: 50
diff changeset
   186
    new_bug_path = issue_fn[(len(repo.root)+1):] + '/new/' + mbox.add(outer) # + 1 for the trailing /
bd974d9e58a2 Fixed an issue that would raise an exception when using hg 1.7
Jason <jason@zzq.org>
parents: 50
diff changeset
   187
    commands.add(ui, repo, new_bug_path)
28
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   188
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   189
    # 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
   190
    if properties:
30
b93ab358f2fc Fixed small iadd bug + added documentation issue (#d913)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 29
diff changeset
   191
        root = _find_root_key(mbox)
b93ab358f2fc Fixed small iadd bug + added documentation issue (#d913)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 29
diff changeset
   192
        msg = mbox[root]
28
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   193
        for property, value in properties:
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   194
            if property in msg:
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   195
                msg.replace_header(property, value)
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   196
            else:
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   197
                msg.add_header(property, value)
30
b93ab358f2fc Fixed small iadd bug + added documentation issue (#d913)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 29
diff changeset
   198
        mbox[root] = msg
28
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   199
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   200
    mbox.close()
1
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
   201
55
c379bed603c6 Fixed f09 (option to commit after iadd)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 54
diff changeset
   202
    if opts['commit']:
c379bed603c6 Fixed f09 (option to commit after iadd)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 54
diff changeset
   203
        commands.commit(ui, repo, issue_fn)
c379bed603c6 Fixed f09 (option to commit after iadd)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 54
diff changeset
   204
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   205
    # 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
   206
    if not id:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   207
        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
   208
    else:
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
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
6
11cab5930258 Function rename + pretty list
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 5
diff changeset
   211
def ishow(ui, repo, id, comment = 0, **opts):
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   212
    """Shows issue ID, or possibly its comment COMMENT"""
17
f70d7e98eb21 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 16
diff changeset
   213
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   214
    comment = int(comment)
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   215
    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
   216
    if not issue:
d013e9b9aba7 ishow: add --mutt option to display issue with mutt
Alexander Solovyov <piranha@piranha.org.ua>
parents: 38
diff changeset
   217
        return ui.warn('No such issue\n')
59
6c388fe11dcc ilist: added --order to sort by date (fixes #82a)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 56
diff changeset
   218
35
2e7575352ef3 Added configuration option to provide an alternative path for the issues directory
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 33
diff changeset
   219
    issues_dir = ui.config('artemis', 'issues', default = default_issues_dir)
26
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   220
    _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
   221
40
d013e9b9aba7 ishow: add --mutt option to display issue with mutt
Alexander Solovyov <piranha@piranha.org.ua>
parents: 38
diff changeset
   222
    if opts.get('mutt'):
d013e9b9aba7 ishow: add --mutt option to display issue with mutt
Alexander Solovyov <piranha@piranha.org.ua>
parents: 38
diff changeset
   223
        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
   224
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   225
    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
   226
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   227
    if opts['all']:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   228
        ui.write('='*70 + '\n')
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   229
        i = 0
38
83910efdbb54 remove trailing whitespaces
Alexander Solovyov <piranha@piranha.org.ua>
parents: 33
diff changeset
   230
        keys = _order_keys_date(mbox)
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   231
        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
   232
            _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
   233
            ui.write('-'*70 + '\n')
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   234
            i += 1
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   235
        return
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   236
32
090ed3ae4c0a Added ability to skip lines starting with a string when showing a message
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 31
diff changeset
   237
    _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
   238
26
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   239
    if opts['extract']:
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   240
        attachment_numbers = map(int, opts['extract'])
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   241
        keys = _order_keys_date(mbox)
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   242
        msg = mbox[keys[comment]]
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   243
        counter = 1
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   244
        for part in msg.walk():
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   245
            ctype = part.get_content_type()
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   246
            maintype, subtype = ctype.split('/', 1)
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   247
            if maintype == 'multipart' or ctype == 'text/plain': continue
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   248
            if counter in attachment_numbers:
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   249
                filename = part.get_filename()
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   250
                if not filename:
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   251
                    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
   252
                    filename = 'attachment-%03d%s' % (counter, ext)
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   253
                fp = open(filename, 'wb')
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   254
                fp.write(part.get_payload(decode = True))
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   255
                fp.close()
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   256
            counter += 1
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   257
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   258
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   259
def _find_issue(ui, repo, id):
35
2e7575352ef3 Added configuration option to provide an alternative path for the issues directory
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 33
diff changeset
   260
    issues_dir = ui.config('artemis', 'issues', default = default_issues_dir)
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   261
    issues_path = os.path.join(repo.root, issues_dir)
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   262
    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
   263
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   264
    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
   265
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   266
    if len(issues) == 0:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   267
        return False, 0
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   268
    elif len(issues) > 1:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   269
        ui.status("Multiple choices:\n")
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   270
        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
   271
        return False, 0
17
f70d7e98eb21 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 16
diff changeset
   272
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   273
    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
   274
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   275
def _get_properties(property_list):
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   276
    return [p.split('=') for p in property_list]
17
f70d7e98eb21 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 16
diff changeset
   277
32
090ed3ae4c0a Added ability to skip lines starting with a string when showing a message
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 31
diff changeset
   278
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
   279
    if index: ui.write("Comment: %d\n" % index)
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   280
    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
   281
        _show_text(ui, message.as_string().strip(), skip)
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   282
    else:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   283
        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
   284
        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
   285
        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
   286
        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
   287
        counter = 1
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   288
        for part in message.walk():
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   289
            ctype = part.get_content_type()
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   290
            maintype, subtype = ctype.split('/', 1)
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   291
            if maintype == 'multipart': continue
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   292
            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
   293
                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
   294
                _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
   295
            else:
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   296
                filename = part.get_filename()
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   297
                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
   298
                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
   299
32
090ed3ae4c0a Added ability to skip lines starting with a string when showing a message
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 31
diff changeset
   300
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
   301
    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
   302
        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
   303
            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
   304
    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
   305
090ed3ae4c0a Added ability to skip lines starting with a string when showing a message
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 31
diff changeset
   306
def _show_mbox(ui, mbox, comment, **opts):
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   307
    # Output the issue (or comment)
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   308
    if comment >= len(mbox):
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   309
        comment = 0
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   310
        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
   311
    keys = _order_keys_date(mbox)
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   312
    root = keys[0]
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   313
    msg = mbox[keys[comment]]
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   314
    ui.write('='*70 + '\n')
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   315
    if comment:
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   316
        ui.write('Subject: %s\n' % mbox[root]['Subject'])
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   317
        ui.write('State: %s\n' % mbox[root]['State'])
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   318
        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
   319
    _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
   320
    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
   321
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   322
    # Read the mailbox into the messages and children dictionaries
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   323
    messages = {}
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   324
    children = {}
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   325
    i = 0
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   326
    for k in keys:
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   327
        m = mbox[k]
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   328
        messages[m['Message-Id']] = (i,m)
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   329
        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
   330
        i += 1
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   331
    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
   332
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   333
    # Iterate over children
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   334
    id = msg['Message-Id']
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   335
    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
   336
    if not id_stack: return
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   337
    ui.write('Comments:\n')
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   338
    while id_stack:
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   339
        id,offset = id_stack.pop()
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   340
        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
   341
        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
   342
        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
   343
    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
   344
21
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   345
def _find_root_key(maildir):
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   346
    for k,m in maildir.iteritems():
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   347
        if 'in-reply-to' not in m:
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   348
            return k
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   349
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   350
def _order_keys_date(mbox):
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   351
    keys = mbox.keys()
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   352
    root = _find_root_key(mbox)
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   353
    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
   354
    return keys
5b3579dc7abf Switched to maildir
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 20
diff changeset
   355
59
6c388fe11dcc ilist: added --order to sort by date (fixes #82a)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 56
diff changeset
   356
def _find_mbox_date(mbox, root, order):
6c388fe11dcc ilist: added --order to sort by date (fixes #82a)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 56
diff changeset
   357
    if order == 'latest':
6c388fe11dcc ilist: added --order to sort by date (fixes #82a)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 56
diff changeset
   358
        keys = _order_keys_date(mbox)
6c388fe11dcc ilist: added --order to sort by date (fixes #82a)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 56
diff changeset
   359
        msg = mbox[keys[-1]]
6c388fe11dcc ilist: added --order to sort by date (fixes #82a)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 56
diff changeset
   360
    else:   # new
6c388fe11dcc ilist: added --order to sort by date (fixes #82a)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 56
diff changeset
   361
        msg = mbox[root]
6c388fe11dcc ilist: added --order to sort by date (fixes #82a)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 56
diff changeset
   362
    return util.parsedate(msg['date'])
6c388fe11dcc ilist: added --order to sort by date (fixes #82a)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 56
diff changeset
   363
8
b1f268a9e4ed Message-Ids in <...> + randomized comment ids
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 7
diff changeset
   364
def _random_id():
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   365
    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
   366
26
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   367
def _create_missing_dirs(issues_path, issue):
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   368
    for d in maildir_dirs:
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   369
        path = os.path.join(issues_path,issue,d)
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   370
        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
   371
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   372
def _create_all_missing_dirs(issues_path, issues):
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   373
    for i in issues:
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   374
        _create_missing_dirs(issues_path, i)
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   375
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   376
def _humanreadable(size):
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   377
    if size > 1024*1024:
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   378
        return '%5.1fM' % (float(size) / (1024*1024))
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   379
    elif size > 1024:
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   380
        return '%5.1fK' % (float(size) / 1024)
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   381
    else:
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   382
        return '%dB' % size
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   383
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   384
def _attach_files(msg, filenames):
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   385
    outer = MIMEMultipart()
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   386
    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
   387
    outer.attach(MIMEText(msg.get_payload()))
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   388
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   389
    for filename in filenames:
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   390
        ctype, encoding = mimetypes.guess_type(filename)
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   391
        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
   392
            # 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
   393
            # use a generic bag-of-bits type.
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   394
            ctype = 'application/octet-stream'
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   395
        maintype, subtype = ctype.split('/', 1)
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   396
        if maintype == 'text':
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   397
            fp = open(filename)
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   398
            # Note: we should handle calculating the charset
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   399
            attachment = MIMEText(fp.read(), _subtype=subtype)
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   400
            fp.close()
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   401
        elif maintype == 'image':
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   402
            fp = open(filename, 'rb')
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   403
            attachment = MIMEImage(fp.read(), _subtype=subtype)
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   404
            fp.close()
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   405
        elif maintype == 'audio':
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   406
            fp = open(filename, 'rb')
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   407
            attachment = MIMEAudio(fp.read(), _subtype=subtype)
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   408
            fp.close()
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   409
        else:
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   410
            fp = open(filename, 'rb')
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   411
            attachment = MIMEBase(maintype, subtype)
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   412
            attachment.set_payload(fp.read())
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   413
            fp.close()
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   414
            # Encode the payload using Base64
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   415
            encoders.encode_base64(attachment)
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   416
        # Set the filename parameter
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   417
        attachment.add_header('Content-Disposition', 'attachment', filename=filename)
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   418
        outer.attach(attachment)
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   419
    return outer
0
c1b34481e50a Initial commit
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   420
28
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   421
def _status_msg(msg):
61
18da6a9fa7b8 Added #c25 (state annotations)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 60
diff changeset
   422
    s = msg['State']
18da6a9fa7b8 Added #c25 (state annotations)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 60
diff changeset
   423
    if s in annotation:
18da6a9fa7b8 Added #c25 (state annotations)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 60
diff changeset
   424
        return '%s=%s' % (s, msg[annotation[s]])
28
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   425
    else:
61
18da6a9fa7b8 Added #c25 (state annotations)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 60
diff changeset
   426
        return s
28
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   427
60
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
   428
def _read_colors(ui):
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
   429
    colors = {}
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
   430
    # defaults
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
   431
    colors['new.color']             = 'red'
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
   432
    colors['new.on_color']          = 'on_grey'
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
   433
    colors['new.attrs']             = 'bold'
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
   434
    colors['resolved.color']        = 'white'
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
   435
    colors['resolved.on_color']     = ''
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
   436
    colors['resolved.attrs']        = ''
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
   437
    for v in colors:
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
   438
        colors[v] = ui.config('artemis', v, colors[v])
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
   439
        if v.endswith('attrs'): colors[v] = colors[v].split()
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
   440
    return colors
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
   441
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
   442
def _color_summary(line, msg, colors):
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
   443
    if msg['State'] == 'new':
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
   444
        return colored(line, colors['new.color'],      attrs = colors['new.attrs'])
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
   445
    elif msg['State'] in state['fixed']:
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
   446
        return colored(line, colors['resolved.color'], attrs = colors['resolved.attrs'])
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
   447
    else:
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
   448
        return line
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
   449
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
   450
def _summary_line(mbox, root, issue, colors):
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
   451
    line = "%s (%3d) [%s]: %s\n" % (issue,
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
   452
                                    len(mbox)-1,                # number of replies (-1 for self)
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
   453
                                    _status_msg(mbox[root]),
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
   454
                                    mbox[root]['Subject'])
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
   455
    return _color_summary(line, mbox[root], colors)
f44b6f1f2115 Added termcolor.py and started working on #edb (colorize output)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 59
diff changeset
   456
0
c1b34481e50a Initial commit
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   457
cmdtable = {
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   458
    'ilist':    (ilist,
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   459
                 [('a', 'all', False,
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   460
                   '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
   461
                  ('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
   462
                   'list issues with specific field values (e.g., -p state=fixed); lists all possible values of a property if no = sign'),
59
6c388fe11dcc ilist: added --order to sort by date (fixes #82a)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 56
diff changeset
   463
                  ('o', 'order', 'new', 'order of the issues; choices: "new" (date submitted), "latest" (date of the last message)'),
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   464
                  ('d', 'date', '', 'restrict to issues matching the date (e.g., -d ">12/28/2007)"'),
35
2e7575352ef3 Added configuration option to provide an alternative path for the issues directory
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 33
diff changeset
   465
                  ('f', 'filter', '', 'restrict to pre-defined filter (in %s/%s*)' % (default_issues_dir, filter_prefix))],
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   466
                 _('hg ilist [OPTIONS]')),
38
83910efdbb54 remove trailing whitespaces
Alexander Solovyov <piranha@piranha.org.ua>
parents: 33
diff changeset
   467
    'iadd':       (iadd,
26
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   468
                 [('a', 'attach', [],
28
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   469
                   '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
   470
                  ('p', 'property', [],
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   471
                   '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
   472
                  ('n', 'no-property-comment', None,
48
7897c850150f iadd: Added --message
Andrey Vlasovskikh <andrey.vlasovskikh@gmail.com>
parents: 40
diff changeset
   473
                   'do not add a comment about changed properties'),
7897c850150f iadd: Added --message
Andrey Vlasovskikh <andrey.vlasovskikh@gmail.com>
parents: 40
diff changeset
   474
                  ('m', 'message', '',
55
c379bed603c6 Fixed f09 (option to commit after iadd)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 54
diff changeset
   475
                   'use <text> as an issue subject'),
c379bed603c6 Fixed f09 (option to commit after iadd)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 54
diff changeset
   476
                  ('c', 'commit', False,
c379bed603c6 Fixed f09 (option to commit after iadd)
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 54
diff changeset
   477
                   'perform a commit after the addition')],
28
8b6b282d3ebd Combined iadd and iupdate (#b8ff) + added special "resolved" state
Dmitriy Morozov <dmitriy@mrzv.org>
parents: 27
diff changeset
   478
                 _('hg iadd [OPTIONS] [ID] [COMMENT]')),
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   479
    'ishow':      (ishow,
26
4574d2d34009 Added ability to attach files
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 24
diff changeset
   480
                 [('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
   481
                  ('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
   482
                  ('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
   483
                  ('', 'mutt', False, 'use mutt to show issue')],
16
49645303d045 Spaces instead of tabs
Mirko Friedenhagen <mirko.friedenhagen@1und1.de>
parents: 15
diff changeset
   484
                 _('hg ishow [OPTIONS] ID [COMMENT]')),
0
c1b34481e50a Initial commit
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   485
}
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
   486
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
   487
# vim: expandtab