artemis.py
author Dmitriy Morozov <morozov@cs.duke.edu>
Sat, 29 Dec 2007 22:44:27 -0500
changeset 4 bf71e2069dbd
parent 2 9e804a85c82c
child 5 cef66aa31468
permissions -rw-r--r--
Basic functionality in place; added feature request for integration with commit (ef1)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
     1
# Author: Dmitriy Morozov <hg@foxcub.org>, 2007
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
     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 _
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
     7
import os, time, random, mailbox, glob, socket
0
c1b34481e50a Initial commit
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
     8
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
     9
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    10
new_state = "new"
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    11
default_state = new_state
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    12
issues_dir = ".issues"
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    13
filter_filename = ".filters"
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    14
date_format = '%a, %d %b %Y %H:%M:%S %Z'
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    15
0
c1b34481e50a Initial commit
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    16
1
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
    17
def list(ui, repo, **opts):
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
    18
	"""List issues associated with the project"""
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
    19
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    20
	# Process options
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    21
	show_all = False or opts['all']
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    22
	properties = _get_properties(opts['property']) or [['state', new_state]]
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    23
	date_match = lambda x: True
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    24
	if opts['date']: 
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    25
		date_match = util.matchdate(opts['date'])
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    26
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    27
	# Find issues
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    28
	issues_path = os.path.join(repo.root, issues_dir)
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    29
	if not os.path.exists(issues_path): return
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    30
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    31
	issues = glob.glob(os.path.join(issues_path, '*'))
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    32
	
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    33
	for issue in issues:
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    34
		mbox = mailbox.mbox(issue)
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    35
		property_match = True
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    36
		for property,value in properties: 
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    37
			property_match = property_match and (mbox[0][property] == value)
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    38
		if not show_all and not property_match: continue
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    39
		if not date_match(util.parsedate(mbox[0]['date'], [date_format])[0]): continue
4
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
    40
		print "%s (%d) [%s]: %s" % (issue[len(issues_path)+1:], # +1 for trailing /
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
    41
									len(mbox)-1,				# number of replies (-1 for self)
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    42
									mbox[0]['State'],
4
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
    43
									mbox[0]['Subject'])
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    44
	
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    45
4
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
    46
def add(ui, repo, id = None, comment = 0):
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
    47
	"""Adds a new issue, or comment to an existing issue ID or its comment COMMENT"""
1
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
    48
	
4
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
    49
	comment = int(comment)
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
    50
1
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
    51
	# First, make sure issues have a directory
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    52
	issues_path = os.path.join(repo.root, issues_dir)
1
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
    53
	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
    54
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
    55
	if id:
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
    56
		issue_fn, issue_id = _find_issue(ui, repo, id)
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
    57
		if not issue_fn: 
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
    58
			ui.warn('No such issue')
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
    59
			return
1
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
    60
	
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
    61
	user = ui.username()
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
    62
4
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
    63
	default_issue_text  = 		"From: %s\nDate: %s\n" % (user, time.strftime(date_format))
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
    64
	if not id: 
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
    65
		default_issue_text += 	"State: %s\n" % default_state
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
    66
	default_issue_text +=		"Subject: brief description\n\n"
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
    67
	default_issue_text += 		"Detailed description."
1
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
    68
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
    69
	issue = ui.edit(default_issue_text, user)
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
    70
	if issue.strip() == '':
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
    71
		ui.warn('Empty issue, ignoring\n')
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
    72
		return
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
    73
	if issue.strip() == default_issue_text:
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
    74
		ui.warn('Unchanged issue text, ignoring\n')
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
    75
		return
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
    76
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    77
	# Create the message
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    78
	msg = mailbox.mboxMessage(issue)
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    79
	msg.set_from('artemis', True)
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    80
	
1
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
    81
	# Pick random filename
4
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
    82
	if not id:
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
    83
		issue_fn = issues_path
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
    84
		while os.path.exists(issue_fn):
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
    85
			issue_id = "%x" % random.randint(2**63, 2**64-1)
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
    86
			issue_fn = os.path.join(issues_path, issue_id)
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
    87
	# else: issue_fn already set
1
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
    88
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    89
	# Add message to the mailbox
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    90
	mbox = mailbox.mbox(issue_fn)
4
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
    91
	if id and comment not in mbox: 
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
    92
		ui.warn('No such comment number in mailbox, commenting on the issue itself\n')
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
    93
	if not id:
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
    94
		msg.add_header('Message-Id', "%s-0-artemis@%s" % (issue_id, socket.gethostname()))
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
    95
	else:
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
    96
		msg.add_header('Message-Id', "%s-%d-artemis@%s" % (issue_id, len(mbox), socket.gethostname()))
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
    97
		msg.add_header('References', mbox[(comment < len(mbox) and comment) or 0]['Message-Id'])
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    98
	mbox.add(msg)
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
    99
	mbox.close()
1
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
   100
4
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   101
	# If adding issue, add the new mailbox to the repository
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   102
	if not id: 
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   103
		repo.add([issue_fn[(len(repo.root)+1):]])			# +1 for the trailing /
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   104
		ui.status('Added new issue %s\n' % issue_id)
1
0bbf290d6f07 Commit artemis before cleaning repository
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 0
diff changeset
   105
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   106
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
def show(ui, repo, id, comment = 0, **opts):
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   108
	"""Shows issue ID, or possibly its comment COMMENT"""
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   109
	
4
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   110
	comment = int(comment)
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   111
	issue, id = _find_issue(ui, repo, id)
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   112
	if not issue: return
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   113
	mbox = mailbox.mbox(issue)
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   114
4
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   115
	if opts['all']:
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   116
		ui.write('='*70 + '\n')
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   117
		for i in xrange(len(mbox)):
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   118
			_write_message(ui, mbox[i], i)
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   119
			ui.write('-'*70 + '\n')
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   120
		return
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   121
4
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   122
	_show_mbox(ui, mbox, comment)
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   123
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   124
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   125
def update(ui, repo, id, **opts):
4
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   126
	"""Update properties of issue ID"""
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   127
4
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   128
	issue, id = _find_issue(ui, repo, id)
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   129
	if not issue: return
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   130
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   131
	properties = _get_properties(opts['property'])
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   132
	
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   133
	# Read the issue
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   134
	mbox = mailbox.mbox(issue)
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   135
	msg = mbox[0]
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   136
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   137
	# Fix the properties
4
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   138
	properties_text = ''
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   139
	for property, value in properties:
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   140
		msg.replace_header(property, value)
4
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   141
		properties_text += '%s=%s\n' % (property, value)
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   142
	mbox[0] = msg
4
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   143
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   144
	# Write down a comment about updated properties
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   145
	if properties and not opts['no_property_comment']:
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   146
		user = ui.username()
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   147
		properties_text  = 	"From: %s\nDate: %s\nSubject: properties changes %s\n\n%s" % (user, time.strftime(date_format),
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   148
							 [property for property, value in properties], 
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   149
							 properties_text)
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   150
		msg = mailbox.mboxMessage(properties_text)
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   151
		msg.add_header('Message-Id', "%s-%d-artemis@%s" % (id, len(mbox), socket.gethostname()))
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   152
		msg.add_header('References', mbox[0]['Message-Id'])
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   153
		mbox.add(msg)
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   154
	mbox.flush()
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   155
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   156
	# Show updated message
4
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   157
	_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
   158
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   159
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   160
def _find_issue(ui, repo, id):
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   161
	issues_path = os.path.join(repo.root, issues_dir)
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   162
	if not os.path.exists(issues_path): return False
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   163
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   164
	issues = glob.glob(os.path.join(issues_path, id + '*'))
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   165
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   166
	if len(issues) == 0:
4
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   167
		return False, 0
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   168
	elif len(issues) > 1:
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   169
		ui.status("Multiple choices:\n")
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   170
		for i in issues: ui.status('  ', i[len(issues_path)+1:], '\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
   171
		return False, 0
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   172
	
4
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   173
	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
   174
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   175
def _get_properties(property_list):
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   176
	return [p.split('=') for p in property_list]
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   177
	
4
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   178
def _write_message(ui, message, index = 0):
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   179
	if index: ui.write("Comment: %d\n" % index)
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   180
	if ui.verbose:
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   181
		ui.write(message.as_string().strip() + '\n')
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   182
	else:
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   183
		if 'From' in message: ui.write('From: %s\n' % message['From'])
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   184
		if 'Date' in message: ui.write('Date: %s\n' % message['Date'])
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   185
		if 'Subject' in message: ui.write('Subject: %s\n' % message['Subject'])
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   186
		if 'State' in message: ui.write('State: %s\n' % message['State'])
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   187
		ui.write('\n' + message.get_payload().strip() + '\n')
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   188
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   189
def _show_mbox(ui, mbox, comment):
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   190
	# Output the issue (or comment)
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   191
	if comment >= len(mbox): 
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   192
		comment = 0
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   193
		ui.warn('Comment out of range, showing the issue itself\n')
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   194
	msg = mbox[comment]
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   195
	ui.write('='*70 + '\n')
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   196
	if comment:
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   197
		ui.write('Subject: %s\n' % mbox[0]['Subject'])
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   198
		ui.write('State: %s\n' % mbox[0]['State'])
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   199
		ui.write('-'*70 + '\n')
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   200
	_write_message(ui, msg, comment)
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   201
	ui.write('-'*70 + '\n')
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   202
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   203
	# Read the mailbox into the messages and children dictionaries
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   204
	messages = {}
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   205
	children = {}
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   206
	for i in xrange(len(mbox)):
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   207
		m = mbox[i]
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   208
		messages[m['Message-Id']] = (i,m)
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   209
		children.setdefault(m['References'], []).append(m['Message-Id'])
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   210
	children[None] = []				# Safeguard against infinte loop on empty Message-Id
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   211
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   212
	# Iterate over children
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   213
	id = msg['Message-Id'] 
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   214
	id_stack = (id in children and map(lambda x: (x, 1), reversed(children[id]))) or []
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   215
	if not id_stack: return
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   216
	ui.write('Comments:\n')
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   217
	while id_stack:
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   218
		id,offset = id_stack.pop()
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   219
		id_stack += (id in children and map(lambda x: (x, offset+1), reversed(children[id]))) or []
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   220
		index, msg = messages[id]
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   221
		ui.write('  '*offset + ('%d: ' % index) + msg['Subject'] + '\n')
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   222
	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
   223
0
c1b34481e50a Initial commit
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   224
c1b34481e50a Initial commit
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   225
cmdtable = {
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   226
	'ilist':	(list, 
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   227
				 [('a', 'all', None, 
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   228
				   'list all issues (by default only those with state new)'),
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   229
				  ('p', 'property', [], 
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   230
				   'list issues with specific field values (e.g., -p state=fixed)'),
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   231
				  ('d', 'date', '', 'restrict to issues matching the date (e.g., -d ">12/28/2007)"'),
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   232
				  ('f', 'filter', '', 'restrict to pre-defined filter (in %s/%s)' % (issues_dir, filter_filename))], 
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   233
				 _('hg ilist [OPTIONS]')),
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   234
	'iadd':   	(add,  
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   235
				 [], 
4
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   236
				 _('hg iadd [ID] [COMMENT]')),
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   237
	'ishow':  	(show, 
4
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   238
				 [('a', 'all', None, 'list all comments')], 
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   239
				 _('hg ishow [OPTIONS] ID [COMMENT]')),
2
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   240
	'iupdate':	(update,
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   241
				 [('p', 'property', [], 
9e804a85c82c list works well, basic show, add, and update functionality
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 1
diff changeset
   242
				   'update properties (e.g., -p state=fixed)'),
4
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   243
				  ('n', 'no-property-comment', None, 
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   244
				   'do not add a comment about changed properties')],
bf71e2069dbd Basic functionality in place; added feature request for integration with commit (ef1)
Dmitriy Morozov <morozov@cs.duke.edu>
parents: 2
diff changeset
   245
				 _('hg iupdate [OPTIONS] ID'))
0
c1b34481e50a Initial commit
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   246
}