hgext/bugzilla.py
author Pulkit Goyal <7895pulkit@gmail.com>
Mon, 26 Jun 2017 23:58:27 +0530
changeset 33107 e88fdec9cb9e
parent 32839 b425ec7fb7f6
child 33393 01a90fed5840
permissions -rw-r--r--
py3: use pycompat.bytestr() to convert str to bytes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
     1
# bugzilla.py - bugzilla integration for mercurial
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
     2
#
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
     3
# Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com>
21542
d12d8d41428e bugzilla: support Bugzilla 4.4.3+ API login token authentication (issue4257)
Jim Hague <jim.hague@acm.org>
parents: 20673
diff changeset
     4
# Copyright 2011-4 Jim Hague <jim.hague@acm.org>
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
     5
#
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8209
diff changeset
     6
# This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 10112
diff changeset
     7
# GNU General Public License version 2 or any later version.
7504
d8cd79fbed3c Revise Bugzilla module comments into extension help.
Jim Hague <jim.hague@acm.org>
parents: 7493
diff changeset
     8
8935
f4f0e902b750 extensions: change descriptions for hook-providing extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8894
diff changeset
     9
'''hooks for integrating with the Bugzilla bug tracker
7504
d8cd79fbed3c Revise Bugzilla module comments into extension help.
Jim Hague <jim.hague@acm.org>
parents: 7493
diff changeset
    10
9252
b03aa86f4c10 bugzilla: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9204
diff changeset
    11
This hook extension adds comments on bugs in Bugzilla when changesets
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
    12
that refer to bugs by Bugzilla ID are seen. The comment is formatted using
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
    13
the Mercurial template mechanism.
7504
d8cd79fbed3c Revise Bugzilla module comments into extension help.
Jim Hague <jim.hague@acm.org>
parents: 7493
diff changeset
    14
16222
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
    15
The bug references can optionally include an update for Bugzilla of the
16223
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
    16
hours spent working on the bug. Bugs can also be marked fixed.
7504
d8cd79fbed3c Revise Bugzilla module comments into extension help.
Jim Hague <jim.hague@acm.org>
parents: 7493
diff changeset
    17
30923
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
    18
Four basic modes of access to Bugzilla are provided:
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
    19
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
    20
1. Access via the Bugzilla REST-API. Requires bugzilla 5.0 or later.
7504
d8cd79fbed3c Revise Bugzilla module comments into extension help.
Jim Hague <jim.hague@acm.org>
parents: 7493
diff changeset
    21
30923
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
    22
2. Access via the Bugzilla XMLRPC interface. Requires Bugzilla 3.4 or later.
13802
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
    23
30923
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
    24
3. Check data via the Bugzilla XMLRPC interface and submit bug change
13802
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
    25
   via email to Bugzilla email interface. Requires Bugzilla 3.4 or later.
9203
e4dbd49b88a9 bugzilla: reformat list of configuration options
Martin Geisler <mg@lazybytes.net>
parents: 9054
diff changeset
    26
30923
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
    27
4. Writing directly to the Bugzilla database. Only Bugzilla installations
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
    28
   using MySQL are supported. Requires Python MySQLdb.
9203
e4dbd49b88a9 bugzilla: reformat list of configuration options
Martin Geisler <mg@lazybytes.net>
parents: 9054
diff changeset
    29
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
    30
Writing directly to the database is susceptible to schema changes, and
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
    31
relies on a Bugzilla contrib script to send out bug change
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
    32
notification emails. This script runs as the user running Mercurial,
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
    33
must be run on the host with the Bugzilla install, and requires
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
    34
permission to read Bugzilla configuration details and the necessary
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
    35
MySQL user and password to have full access rights to the Bugzilla
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
    36
database. For these reasons this access mode is now considered
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
    37
deprecated, and will not be updated for new Bugzilla versions going
16222
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
    38
forward. Only adding comments is supported in this access mode.
9203
e4dbd49b88a9 bugzilla: reformat list of configuration options
Martin Geisler <mg@lazybytes.net>
parents: 9054
diff changeset
    39
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
    40
Access via XMLRPC needs a Bugzilla username and password to be specified
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
    41
in the configuration. Comments are added under that username. Since the
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
    42
configuration must be readable by all Mercurial users, it is recommended
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
    43
that the rights of that user are restricted in Bugzilla to the minimum
16223
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
    44
necessary to add comments. Marking bugs fixed requires Bugzilla 4.0 and later.
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
    45
13871
22d200e49b10 bugzilla: more documentation fixes
Jim Hague <jim.hague@acm.org>
parents: 13870
diff changeset
    46
Access via XMLRPC/email uses XMLRPC to query Bugzilla, but sends
13802
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
    47
email to the Bugzilla email interface to submit comments to bugs.
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
    48
The From: address in the email is set to the email address of the Mercurial
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
    49
user, so the comment appears to come from the Mercurial user. In the event
17534
c5f7c4b515a4 en-us: recognized
timeless@mozdev.org
parents: 16881
diff changeset
    50
that the Mercurial user email is not recognized by Bugzilla as a Bugzilla
13871
22d200e49b10 bugzilla: more documentation fixes
Jim Hague <jim.hague@acm.org>
parents: 13870
diff changeset
    51
user, the email associated with the Bugzilla username used to log into
16223
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
    52
Bugzilla is used instead as the source of the comment. Marking bugs fixed
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
    53
works on all supported Bugzilla versions.
13802
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
    54
30923
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
    55
Access via the REST-API needs either a Bugzilla username and password
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
    56
or an apikey specified in the configuration. Comments are made under
32574
870248603a4e bugzilla: fix typo in help text
Wagner Bruna <wbruna@softwareexpress.com.br>
parents: 31570
diff changeset
    57
the given username or the user associated with the apikey in Bugzilla.
30923
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
    58
13802
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
    59
Configuration items common to all access modes:
9203
e4dbd49b88a9 bugzilla: reformat list of configuration options
Martin Geisler <mg@lazybytes.net>
parents: 9054
diff changeset
    60
13833
64ad07dff0a8 bugzilla: prefix each config option with section
Martin Geisler <mg@aragost.com>
parents: 13832
diff changeset
    61
bugzilla.version
17537
31f32a96e1e3 Merge spelling fixes
Bryan O'Sullivan <bryano@fb.com>
parents: 17424 17534
diff changeset
    62
  The access type to use. Values recognized are:
13871
22d200e49b10 bugzilla: more documentation fixes
Jim Hague <jim.hague@acm.org>
parents: 13870
diff changeset
    63
30923
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
    64
  :``restapi``:      Bugzilla REST-API, Bugzilla 5.0 and later.
13883
fc83d2ca9cfb bugzilla: fix reST error introduced in 22d200e49b10
Martin Geisler <mg@aragost.com>
parents: 13871
diff changeset
    65
  :``xmlrpc``:       Bugzilla XMLRPC interface.
fc83d2ca9cfb bugzilla: fix reST error introduced in 22d200e49b10
Martin Geisler <mg@aragost.com>
parents: 13871
diff changeset
    66
  :``xmlrpc+email``: Bugzilla XMLRPC and email interfaces.
fc83d2ca9cfb bugzilla: fix reST error introduced in 22d200e49b10
Martin Geisler <mg@aragost.com>
parents: 13871
diff changeset
    67
  :``3.0``:          MySQL access, Bugzilla 3.0 and later.
fc83d2ca9cfb bugzilla: fix reST error introduced in 22d200e49b10
Martin Geisler <mg@aragost.com>
parents: 13871
diff changeset
    68
  :``2.18``:         MySQL access, Bugzilla 2.18 and up to but not
fc83d2ca9cfb bugzilla: fix reST error introduced in 22d200e49b10
Martin Geisler <mg@aragost.com>
parents: 13871
diff changeset
    69
                     including 3.0.
fc83d2ca9cfb bugzilla: fix reST error introduced in 22d200e49b10
Martin Geisler <mg@aragost.com>
parents: 13871
diff changeset
    70
  :``2.16``:         MySQL access, Bugzilla 2.16 and up to but not
fc83d2ca9cfb bugzilla: fix reST error introduced in 22d200e49b10
Martin Geisler <mg@aragost.com>
parents: 13871
diff changeset
    71
                     including 2.18.
7985
0edca606c0f1 bugzilla: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7762
diff changeset
    72
13833
64ad07dff0a8 bugzilla: prefix each config option with section
Martin Geisler <mg@aragost.com>
parents: 13832
diff changeset
    73
bugzilla.regexp
16223
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
    74
  Regular expression to match bug IDs for update in changeset commit message.
16222
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
    75
  It must contain one "()" named group ``<ids>`` containing the bug
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
    76
  IDs separated by non-digit characters. It may also contain
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
    77
  a named group ``<hours>`` with a floating-point number giving the
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
    78
  hours worked on the bug. If no named groups are present, the first
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
    79
  "()" group is assumed to contain the bug IDs, and work time is not
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
    80
  updated. The default expression matches ``Bug 1234``, ``Bug no. 1234``,
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
    81
  ``Bug number 1234``, ``Bugs 1234,5678``, ``Bug 1234 and 5678`` and
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
    82
  variations thereof, followed by an hours number prefixed by ``h`` or
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
    83
  ``hours``, e.g. ``hours 1.5``. Matching is case insensitive.
9203
e4dbd49b88a9 bugzilla: reformat list of configuration options
Martin Geisler <mg@lazybytes.net>
parents: 9054
diff changeset
    84
16223
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
    85
bugzilla.fixregexp
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
    86
  Regular expression to match bug IDs for marking fixed in changeset
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
    87
  commit message. This must contain a "()" named group ``<ids>` containing
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
    88
  the bug IDs separated by non-digit characters. It may also contain
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
    89
  a named group ``<hours>`` with a floating-point number giving the
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
    90
  hours worked on the bug. If no named groups are present, the first
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
    91
  "()" group is assumed to contain the bug IDs, and work time is not
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
    92
  updated. The default expression matches ``Fixes 1234``, ``Fixes bug 1234``,
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
    93
  ``Fixes bugs 1234,5678``, ``Fixes 1234 and 5678`` and
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
    94
  variations thereof, followed by an hours number prefixed by ``h`` or
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
    95
  ``hours``, e.g. ``hours 1.5``. Matching is case insensitive.
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
    96
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
    97
bugzilla.fixstatus
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
    98
  The status to set a bug to when marking fixed. Default ``RESOLVED``.
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
    99
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   100
bugzilla.fixresolution
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   101
  The resolution to set a bug to when marking fixed. Default ``FIXED``.
9203
e4dbd49b88a9 bugzilla: reformat list of configuration options
Martin Geisler <mg@lazybytes.net>
parents: 9054
diff changeset
   102
13833
64ad07dff0a8 bugzilla: prefix each config option with section
Martin Geisler <mg@aragost.com>
parents: 13832
diff changeset
   103
bugzilla.style
9203
e4dbd49b88a9 bugzilla: reformat list of configuration options
Martin Geisler <mg@lazybytes.net>
parents: 9054
diff changeset
   104
  The style file to use when formatting comments.
e4dbd49b88a9 bugzilla: reformat list of configuration options
Martin Geisler <mg@lazybytes.net>
parents: 9054
diff changeset
   105
13833
64ad07dff0a8 bugzilla: prefix each config option with section
Martin Geisler <mg@aragost.com>
parents: 13832
diff changeset
   106
bugzilla.template
9252
b03aa86f4c10 bugzilla: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9204
diff changeset
   107
  Template to use when formatting comments. Overrides style if
b03aa86f4c10 bugzilla: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9204
diff changeset
   108
  specified. In addition to the usual Mercurial keywords, the
13884
773a833ddbc6 bugzilla: convert a verbatim block to a field list
Martin Geisler <mg@aragost.com>
parents: 13883
diff changeset
   109
  extension specifies:
9203
e4dbd49b88a9 bugzilla: reformat list of configuration options
Martin Geisler <mg@lazybytes.net>
parents: 9054
diff changeset
   110
13884
773a833ddbc6 bugzilla: convert a verbatim block to a field list
Martin Geisler <mg@aragost.com>
parents: 13883
diff changeset
   111
  :``{bug}``:     The Bugzilla bug ID.
773a833ddbc6 bugzilla: convert a verbatim block to a field list
Martin Geisler <mg@aragost.com>
parents: 13883
diff changeset
   112
  :``{root}``:    The full pathname of the Mercurial repository.
773a833ddbc6 bugzilla: convert a verbatim block to a field list
Martin Geisler <mg@aragost.com>
parents: 13883
diff changeset
   113
  :``{webroot}``: Stripped pathname of the Mercurial repository.
773a833ddbc6 bugzilla: convert a verbatim block to a field list
Martin Geisler <mg@aragost.com>
parents: 13883
diff changeset
   114
  :``{hgweb}``:   Base URL for browsing Mercurial repositories.
7504
d8cd79fbed3c Revise Bugzilla module comments into extension help.
Jim Hague <jim.hague@acm.org>
parents: 7493
diff changeset
   115
13842
4cffce61bd92 bugzilla: fix bad reST markup
Martin Geisler <mg@aragost.com>
parents: 13841
diff changeset
   116
  Default ``changeset {node|short} in repo {root} refers to bug
4cffce61bd92 bugzilla: fix bad reST markup
Martin Geisler <mg@aragost.com>
parents: 13841
diff changeset
   117
  {bug}.\\ndetails:\\n\\t{desc|tabindent}``
9203
e4dbd49b88a9 bugzilla: reformat list of configuration options
Martin Geisler <mg@lazybytes.net>
parents: 9054
diff changeset
   118
13833
64ad07dff0a8 bugzilla: prefix each config option with section
Martin Geisler <mg@aragost.com>
parents: 13832
diff changeset
   119
bugzilla.strip
13841
367805c848e5 bugzilla: markup literal text as such
Martin Geisler <mg@aragost.com>
parents: 13837
diff changeset
   120
  The number of path separator characters to strip from the front of
367805c848e5 bugzilla: markup literal text as such
Martin Geisler <mg@aragost.com>
parents: 13837
diff changeset
   121
  the Mercurial repository path (``{root}`` in templates) to produce
367805c848e5 bugzilla: markup literal text as such
Martin Geisler <mg@aragost.com>
parents: 13837
diff changeset
   122
  ``{webroot}``. For example, a repository with ``{root}``
367805c848e5 bugzilla: markup literal text as such
Martin Geisler <mg@aragost.com>
parents: 13837
diff changeset
   123
  ``/var/local/my-project`` with a strip of 2 gives a value for
367805c848e5 bugzilla: markup literal text as such
Martin Geisler <mg@aragost.com>
parents: 13837
diff changeset
   124
  ``{webroot}`` of ``my-project``. Default 0.
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   125
13833
64ad07dff0a8 bugzilla: prefix each config option with section
Martin Geisler <mg@aragost.com>
parents: 13832
diff changeset
   126
web.baseurl
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   127
  Base URL for browsing Mercurial repositories. Referenced from
13896
3b4025dcb223 bugzilla: more documentation formatting fixups
Jim Hague <jim.hague@acm.org>
parents: 13884
diff changeset
   128
  templates as ``{hgweb}``.
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   129
13802
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   130
Configuration items common to XMLRPC+email and MySQL access modes:
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   131
13833
64ad07dff0a8 bugzilla: prefix each config option with section
Martin Geisler <mg@aragost.com>
parents: 13832
diff changeset
   132
bugzilla.usermap
13802
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   133
  Path of file containing Mercurial committer email to Bugzilla user email
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   134
  mappings. If specified, the file should contain one mapping per
13835
135bed43e20c bugzilla: show usermap syntax more clearly
Martin Geisler <mg@aragost.com>
parents: 13834
diff changeset
   135
  line::
135bed43e20c bugzilla: show usermap syntax more clearly
Martin Geisler <mg@aragost.com>
parents: 13834
diff changeset
   136
135bed43e20c bugzilla: show usermap syntax more clearly
Martin Geisler <mg@aragost.com>
parents: 13834
diff changeset
   137
    committer = Bugzilla user
135bed43e20c bugzilla: show usermap syntax more clearly
Martin Geisler <mg@aragost.com>
parents: 13834
diff changeset
   138
13896
3b4025dcb223 bugzilla: more documentation formatting fixups
Jim Hague <jim.hague@acm.org>
parents: 13884
diff changeset
   139
  See also the ``[usermap]`` section.
13802
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   140
13836
ed15922af2f9 bugzilla: markup section names as literal text
Martin Geisler <mg@aragost.com>
parents: 13835
diff changeset
   141
The ``[usermap]`` section is used to specify mappings of Mercurial
13834
0aa2cfd0b21a bugzilla: use standard section.name notation
Martin Geisler <mg@aragost.com>
parents: 13833
diff changeset
   142
committer email to Bugzilla user email. See also ``bugzilla.usermap``.
13835
135bed43e20c bugzilla: show usermap syntax more clearly
Martin Geisler <mg@aragost.com>
parents: 13834
diff changeset
   143
Contains entries of the form ``committer = Bugzilla user``.
13802
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   144
30923
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   145
XMLRPC and REST-API access mode configuration:
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   146
13833
64ad07dff0a8 bugzilla: prefix each config option with section
Martin Geisler <mg@aragost.com>
parents: 13832
diff changeset
   147
bugzilla.bzurl
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   148
  The base URL for the Bugzilla installation.
13841
367805c848e5 bugzilla: markup literal text as such
Martin Geisler <mg@aragost.com>
parents: 13837
diff changeset
   149
  Default ``http://localhost/bugzilla``.
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   150
13833
64ad07dff0a8 bugzilla: prefix each config option with section
Martin Geisler <mg@aragost.com>
parents: 13832
diff changeset
   151
bugzilla.user
13841
367805c848e5 bugzilla: markup literal text as such
Martin Geisler <mg@aragost.com>
parents: 13837
diff changeset
   152
  The username to use to log into Bugzilla via XMLRPC. Default
367805c848e5 bugzilla: markup literal text as such
Martin Geisler <mg@aragost.com>
parents: 13837
diff changeset
   153
  ``bugs``.
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   154
13833
64ad07dff0a8 bugzilla: prefix each config option with section
Martin Geisler <mg@aragost.com>
parents: 13832
diff changeset
   155
bugzilla.password
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   156
  The password for Bugzilla login.
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   157
30923
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   158
REST-API access mode uses the options listed above as well as:
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   159
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   160
bugzilla.apikey
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   161
  An apikey generated on the Bugzilla instance for api access.
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   162
  Using an apikey removes the need to store the user and password
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   163
  options.
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   164
13802
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   165
XMLRPC+email access mode uses the XMLRPC access mode configuration items,
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   166
and also:
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   167
13833
64ad07dff0a8 bugzilla: prefix each config option with section
Martin Geisler <mg@aragost.com>
parents: 13832
diff changeset
   168
bugzilla.bzemail
13802
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   169
  The Bugzilla email address.
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   170
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   171
In addition, the Mercurial email settings must be configured. See the
13837
22f20d0fe2d3 bugzilla: refer to hgrc(5) man page with normal notation
Martin Geisler <mg@aragost.com>
parents: 13836
diff changeset
   172
documentation in hgrc(5), sections ``[email]`` and ``[smtp]``.
13802
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   173
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   174
MySQL access mode configuration:
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   175
13833
64ad07dff0a8 bugzilla: prefix each config option with section
Martin Geisler <mg@aragost.com>
parents: 13832
diff changeset
   176
bugzilla.host
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   177
  Hostname of the MySQL server holding the Bugzilla database.
13841
367805c848e5 bugzilla: markup literal text as such
Martin Geisler <mg@aragost.com>
parents: 13837
diff changeset
   178
  Default ``localhost``.
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   179
13833
64ad07dff0a8 bugzilla: prefix each config option with section
Martin Geisler <mg@aragost.com>
parents: 13832
diff changeset
   180
bugzilla.db
13841
367805c848e5 bugzilla: markup literal text as such
Martin Geisler <mg@aragost.com>
parents: 13837
diff changeset
   181
  Name of the Bugzilla database in MySQL. Default ``bugs``.
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   182
13833
64ad07dff0a8 bugzilla: prefix each config option with section
Martin Geisler <mg@aragost.com>
parents: 13832
diff changeset
   183
bugzilla.user
13841
367805c848e5 bugzilla: markup literal text as such
Martin Geisler <mg@aragost.com>
parents: 13837
diff changeset
   184
  Username to use to access MySQL server. Default ``bugs``.
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   185
13833
64ad07dff0a8 bugzilla: prefix each config option with section
Martin Geisler <mg@aragost.com>
parents: 13832
diff changeset
   186
bugzilla.password
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   187
  Password to use to access MySQL server.
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   188
13833
64ad07dff0a8 bugzilla: prefix each config option with section
Martin Geisler <mg@aragost.com>
parents: 13832
diff changeset
   189
bugzilla.timeout
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   190
  Database connection timeout (seconds). Default 5.
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   191
13833
64ad07dff0a8 bugzilla: prefix each config option with section
Martin Geisler <mg@aragost.com>
parents: 13832
diff changeset
   192
bugzilla.bzuser
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   193
  Fallback Bugzilla user name to record comments with, if changeset
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   194
  committer cannot be found as a Bugzilla user.
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   195
13833
64ad07dff0a8 bugzilla: prefix each config option with section
Martin Geisler <mg@aragost.com>
parents: 13832
diff changeset
   196
bugzilla.bzdir
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   197
   Bugzilla install directory. Used by default notify. Default
13841
367805c848e5 bugzilla: markup literal text as such
Martin Geisler <mg@aragost.com>
parents: 13837
diff changeset
   198
   ``/var/www/html/bugzilla``.
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   199
13833
64ad07dff0a8 bugzilla: prefix each config option with section
Martin Geisler <mg@aragost.com>
parents: 13832
diff changeset
   200
bugzilla.notify
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   201
  The command to run to get Bugzilla to send bug change notification
13841
367805c848e5 bugzilla: markup literal text as such
Martin Geisler <mg@aragost.com>
parents: 13837
diff changeset
   202
  emails. Substitutes from a map with 3 keys, ``bzdir``, ``id`` (bug
367805c848e5 bugzilla: markup literal text as such
Martin Geisler <mg@aragost.com>
parents: 13837
diff changeset
   203
  id) and ``user`` (committer bugzilla email). Default depends on
367805c848e5 bugzilla: markup literal text as such
Martin Geisler <mg@aragost.com>
parents: 13837
diff changeset
   204
  version; from 2.18 it is "cd %(bzdir)s && perl -T
367805c848e5 bugzilla: markup literal text as such
Martin Geisler <mg@aragost.com>
parents: 13837
diff changeset
   205
  contrib/sendbugmail.pl %(id)s %(user)s".
7504
d8cd79fbed3c Revise Bugzilla module comments into extension help.
Jim Hague <jim.hague@acm.org>
parents: 7493
diff changeset
   206
9203
e4dbd49b88a9 bugzilla: reformat list of configuration options
Martin Geisler <mg@lazybytes.net>
parents: 9054
diff changeset
   207
Activating the extension::
7504
d8cd79fbed3c Revise Bugzilla module comments into extension help.
Jim Hague <jim.hague@acm.org>
parents: 7493
diff changeset
   208
d8cd79fbed3c Revise Bugzilla module comments into extension help.
Jim Hague <jim.hague@acm.org>
parents: 7493
diff changeset
   209
    [extensions]
10112
703db37d186b hgext: enable extensions without "hgext." prefix in help texts
Martin Geisler <mg@lazybytes.net>
parents: 9252
diff changeset
   210
    bugzilla =
7504
d8cd79fbed3c Revise Bugzilla module comments into extension help.
Jim Hague <jim.hague@acm.org>
parents: 7493
diff changeset
   211
d8cd79fbed3c Revise Bugzilla module comments into extension help.
Jim Hague <jim.hague@acm.org>
parents: 7493
diff changeset
   212
    [hooks]
d8cd79fbed3c Revise Bugzilla module comments into extension help.
Jim Hague <jim.hague@acm.org>
parents: 7493
diff changeset
   213
    # run bugzilla hook on every change pulled or pushed in here
d8cd79fbed3c Revise Bugzilla module comments into extension help.
Jim Hague <jim.hague@acm.org>
parents: 7493
diff changeset
   214
    incoming.bugzilla = python:hgext.bugzilla.hook
d8cd79fbed3c Revise Bugzilla module comments into extension help.
Jim Hague <jim.hague@acm.org>
parents: 7493
diff changeset
   215
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   216
Example configurations:
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   217
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   218
XMLRPC example configuration. This uses the Bugzilla at
13841
367805c848e5 bugzilla: markup literal text as such
Martin Geisler <mg@aragost.com>
parents: 13837
diff changeset
   219
``http://my-project.org/bugzilla``, logging in as user
367805c848e5 bugzilla: markup literal text as such
Martin Geisler <mg@aragost.com>
parents: 13837
diff changeset
   220
``bugmail@my-project.org`` with password ``plugh``. It is used with a
13870
ce066d424bba bugzilla: correct sample configurations
Jim Hague <jim.hague@acm.org>
parents: 13854
diff changeset
   221
collection of Mercurial repositories in ``/var/local/hg/repos/``,
ce066d424bba bugzilla: correct sample configurations
Jim Hague <jim.hague@acm.org>
parents: 13854
diff changeset
   222
with a web interface at ``http://my-project.org/hg``. ::
7504
d8cd79fbed3c Revise Bugzilla module comments into extension help.
Jim Hague <jim.hague@acm.org>
parents: 7493
diff changeset
   223
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   224
    [bugzilla]
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   225
    bzurl=http://my-project.org/bugzilla
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   226
    user=bugmail@my-project.org
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   227
    password=plugh
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   228
    version=xmlrpc
13870
ce066d424bba bugzilla: correct sample configurations
Jim Hague <jim.hague@acm.org>
parents: 13854
diff changeset
   229
    template=Changeset {node|short} in {root|basename}.
ce066d424bba bugzilla: correct sample configurations
Jim Hague <jim.hague@acm.org>
parents: 13854
diff changeset
   230
             {hgweb}/{webroot}/rev/{node|short}\\n
ce066d424bba bugzilla: correct sample configurations
Jim Hague <jim.hague@acm.org>
parents: 13854
diff changeset
   231
             {desc}\\n
ce066d424bba bugzilla: correct sample configurations
Jim Hague <jim.hague@acm.org>
parents: 13854
diff changeset
   232
    strip=5
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   233
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   234
    [web]
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   235
    baseurl=http://my-project.org/hg
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   236
13802
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   237
XMLRPC+email example configuration. This uses the Bugzilla at
13841
367805c848e5 bugzilla: markup literal text as such
Martin Geisler <mg@aragost.com>
parents: 13837
diff changeset
   238
``http://my-project.org/bugzilla``, logging in as user
14619
29f55c0e39e7 bugzilla: fix typo in documentation
Wagner Bruna <wbruna@softwareexpress.com.br>
parents: 14234
diff changeset
   239
``bugmail@my-project.org`` with password ``plugh``. It is used with a
13870
ce066d424bba bugzilla: correct sample configurations
Jim Hague <jim.hague@acm.org>
parents: 13854
diff changeset
   240
collection of Mercurial repositories in ``/var/local/hg/repos/``,
ce066d424bba bugzilla: correct sample configurations
Jim Hague <jim.hague@acm.org>
parents: 13854
diff changeset
   241
with a web interface at ``http://my-project.org/hg``. Bug comments
ce066d424bba bugzilla: correct sample configurations
Jim Hague <jim.hague@acm.org>
parents: 13854
diff changeset
   242
are sent to the Bugzilla email address
13854
5ed036e42fd9 bugzilla: fix documentation typo
Patrick Mezard <pmezard@gmail.com>
parents: 13842
diff changeset
   243
``bugzilla@my-project.org``. ::
13802
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   244
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   245
    [bugzilla]
13870
ce066d424bba bugzilla: correct sample configurations
Jim Hague <jim.hague@acm.org>
parents: 13854
diff changeset
   246
    bzurl=http://my-project.org/bugzilla
13802
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   247
    user=bugmail@my-project.org
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   248
    password=plugh
21842
fd2527d9b995 bugzilla: correct config documentation error
Jim Hague <jim.hague@acm.org>
parents: 21542
diff changeset
   249
    version=xmlrpc+email
13802
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   250
    bzemail=bugzilla@my-project.org
13870
ce066d424bba bugzilla: correct sample configurations
Jim Hague <jim.hague@acm.org>
parents: 13854
diff changeset
   251
    template=Changeset {node|short} in {root|basename}.
ce066d424bba bugzilla: correct sample configurations
Jim Hague <jim.hague@acm.org>
parents: 13854
diff changeset
   252
             {hgweb}/{webroot}/rev/{node|short}\\n
ce066d424bba bugzilla: correct sample configurations
Jim Hague <jim.hague@acm.org>
parents: 13854
diff changeset
   253
             {desc}\\n
ce066d424bba bugzilla: correct sample configurations
Jim Hague <jim.hague@acm.org>
parents: 13854
diff changeset
   254
    strip=5
13802
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   255
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   256
    [web]
13870
ce066d424bba bugzilla: correct sample configurations
Jim Hague <jim.hague@acm.org>
parents: 13854
diff changeset
   257
    baseurl=http://my-project.org/hg
ce066d424bba bugzilla: correct sample configurations
Jim Hague <jim.hague@acm.org>
parents: 13854
diff changeset
   258
ce066d424bba bugzilla: correct sample configurations
Jim Hague <jim.hague@acm.org>
parents: 13854
diff changeset
   259
    [usermap]
ce066d424bba bugzilla: correct sample configurations
Jim Hague <jim.hague@acm.org>
parents: 13854
diff changeset
   260
    user@emaildomain.com=user.name@bugzilladomain.com
13802
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   261
13870
ce066d424bba bugzilla: correct sample configurations
Jim Hague <jim.hague@acm.org>
parents: 13854
diff changeset
   262
MySQL example configuration. This has a local Bugzilla 3.2 installation
ce066d424bba bugzilla: correct sample configurations
Jim Hague <jim.hague@acm.org>
parents: 13854
diff changeset
   263
in ``/opt/bugzilla-3.2``. The MySQL database is on ``localhost``,
ce066d424bba bugzilla: correct sample configurations
Jim Hague <jim.hague@acm.org>
parents: 13854
diff changeset
   264
the Bugzilla database name is ``bugs`` and MySQL is
ce066d424bba bugzilla: correct sample configurations
Jim Hague <jim.hague@acm.org>
parents: 13854
diff changeset
   265
accessed with MySQL username ``bugs`` password ``XYZZY``. It is used
ce066d424bba bugzilla: correct sample configurations
Jim Hague <jim.hague@acm.org>
parents: 13854
diff changeset
   266
with a collection of Mercurial repositories in ``/var/local/hg/repos/``,
ce066d424bba bugzilla: correct sample configurations
Jim Hague <jim.hague@acm.org>
parents: 13854
diff changeset
   267
with a web interface at ``http://my-project.org/hg``. ::
7504
d8cd79fbed3c Revise Bugzilla module comments into extension help.
Jim Hague <jim.hague@acm.org>
parents: 7493
diff changeset
   268
d8cd79fbed3c Revise Bugzilla module comments into extension help.
Jim Hague <jim.hague@acm.org>
parents: 7493
diff changeset
   269
    [bugzilla]
d8cd79fbed3c Revise Bugzilla module comments into extension help.
Jim Hague <jim.hague@acm.org>
parents: 7493
diff changeset
   270
    host=localhost
d8cd79fbed3c Revise Bugzilla module comments into extension help.
Jim Hague <jim.hague@acm.org>
parents: 7493
diff changeset
   271
    password=XYZZY
d8cd79fbed3c Revise Bugzilla module comments into extension help.
Jim Hague <jim.hague@acm.org>
parents: 7493
diff changeset
   272
    version=3.0
d8cd79fbed3c Revise Bugzilla module comments into extension help.
Jim Hague <jim.hague@acm.org>
parents: 7493
diff changeset
   273
    bzuser=unknown@domain.com
7618
6c89dd0a7797 Bugzilla 2.18 and on use contrib/sendbugmail.pl, not processmail.
Jim Hague <jim.hague@acm.org>
parents: 7504
diff changeset
   274
    bzdir=/opt/bugzilla-3.2
9204
8d59e43854d9 bugzilla: wrap example template line
Martin Geisler <mg@lazybytes.net>
parents: 9203
diff changeset
   275
    template=Changeset {node|short} in {root|basename}.
8d59e43854d9 bugzilla: wrap example template line
Martin Geisler <mg@lazybytes.net>
parents: 9203
diff changeset
   276
             {hgweb}/{webroot}/rev/{node|short}\\n
8d59e43854d9 bugzilla: wrap example template line
Martin Geisler <mg@lazybytes.net>
parents: 9203
diff changeset
   277
             {desc}\\n
7504
d8cd79fbed3c Revise Bugzilla module comments into extension help.
Jim Hague <jim.hague@acm.org>
parents: 7493
diff changeset
   278
    strip=5
d8cd79fbed3c Revise Bugzilla module comments into extension help.
Jim Hague <jim.hague@acm.org>
parents: 7493
diff changeset
   279
d8cd79fbed3c Revise Bugzilla module comments into extension help.
Jim Hague <jim.hague@acm.org>
parents: 7493
diff changeset
   280
    [web]
13870
ce066d424bba bugzilla: correct sample configurations
Jim Hague <jim.hague@acm.org>
parents: 13854
diff changeset
   281
    baseurl=http://my-project.org/hg
7504
d8cd79fbed3c Revise Bugzilla module comments into extension help.
Jim Hague <jim.hague@acm.org>
parents: 7493
diff changeset
   282
d8cd79fbed3c Revise Bugzilla module comments into extension help.
Jim Hague <jim.hague@acm.org>
parents: 7493
diff changeset
   283
    [usermap]
d8cd79fbed3c Revise Bugzilla module comments into extension help.
Jim Hague <jim.hague@acm.org>
parents: 7493
diff changeset
   284
    user@emaildomain.com=user.name@bugzilladomain.com
d8cd79fbed3c Revise Bugzilla module comments into extension help.
Jim Hague <jim.hague@acm.org>
parents: 7493
diff changeset
   285
13802
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   286
All the above add a comment to the Bugzilla bug record of the form::
7504
d8cd79fbed3c Revise Bugzilla module comments into extension help.
Jim Hague <jim.hague@acm.org>
parents: 7493
diff changeset
   287
d8cd79fbed3c Revise Bugzilla module comments into extension help.
Jim Hague <jim.hague@acm.org>
parents: 7493
diff changeset
   288
    Changeset 3b16791d6642 in repository-name.
13870
ce066d424bba bugzilla: correct sample configurations
Jim Hague <jim.hague@acm.org>
parents: 13854
diff changeset
   289
    http://my-project.org/hg/repository-name/rev/3b16791d6642
7504
d8cd79fbed3c Revise Bugzilla module comments into extension help.
Jim Hague <jim.hague@acm.org>
parents: 7493
diff changeset
   290
d8cd79fbed3c Revise Bugzilla module comments into extension help.
Jim Hague <jim.hague@acm.org>
parents: 7493
diff changeset
   291
    Changeset commit comment. Bug 1234.
d8cd79fbed3c Revise Bugzilla module comments into extension help.
Jim Hague <jim.hague@acm.org>
parents: 7493
diff changeset
   292
'''
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   293
28091
2f0384242b35 bugzilla: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
   294
from __future__ import absolute_import
2f0384242b35 bugzilla: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
   295
30923
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   296
import json
28091
2f0384242b35 bugzilla: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
   297
import re
2f0384242b35 bugzilla: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
   298
import time
2f0384242b35 bugzilla: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
   299
3891
6b4127c7d52a Simplify i18n imports
Matt Mackall <mpm@selenic.com>
parents: 3877
diff changeset
   300
from mercurial.i18n import _
6211
f89fd07fc51d Expand import * to allow Pyflakes to find problems
Joel Rosdahl <joel@rosdahl.net>
parents: 5975
diff changeset
   301
from mercurial.node import short
28091
2f0384242b35 bugzilla: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
   302
from mercurial import (
2f0384242b35 bugzilla: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
   303
    cmdutil,
2f0384242b35 bugzilla: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
   304
    error,
2f0384242b35 bugzilla: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
   305
    mail,
30923
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   306
    url,
28091
2f0384242b35 bugzilla: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
   307
    util,
2f0384242b35 bugzilla: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
   308
)
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   309
29432
34b914ac573e py3: conditionalize xmlrpclib import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29431
diff changeset
   310
xmlrpclib = util.xmlrpclib
29431
80880ad3fccd py3: conditionalize the urlparse import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28950
diff changeset
   311
29841
d5883fd055c6 extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents: 29432
diff changeset
   312
# Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
25186
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 24987
diff changeset
   313
# extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 24987
diff changeset
   314
# be specifying the version(s) of Mercurial they are tested with, or
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 24987
diff changeset
   315
# leave the attribute unspecified.
29841
d5883fd055c6 extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents: 29432
diff changeset
   316
testedwith = 'ships-with-hg-core'
16743
38caf405d010 hgext: mark all first-party extensions as such
Augie Fackler <raf@durin42.com>
parents: 16683
diff changeset
   317
13800
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   318
class bzaccess(object):
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   319
    '''Base class for access to Bugzilla.'''
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   320
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   321
    def __init__(self, ui):
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   322
        self.ui = ui
13800
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   323
        usermap = self.ui.config('bugzilla', 'usermap')
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   324
        if usermap:
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   325
            self.ui.readconfig(usermap, sections=['usermap'])
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   326
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   327
    def map_committer(self, user):
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   328
        '''map name of committer to Bugzilla user name.'''
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   329
        for committer, bzuser in self.ui.configitems('usermap'):
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   330
            if committer.lower() == user.lower():
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   331
                return bzuser
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   332
        return user
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   333
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   334
    # Methods to be implemented by access classes.
16221
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   335
    #
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   336
    # 'bugs' is a dict keyed on bug id, where values are a dict holding
17534
c5f7c4b515a4 en-us: recognized
timeless@mozdev.org
parents: 16881
diff changeset
   337
    # updates to bug state. Recognized dict keys are:
16222
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
   338
    #
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
   339
    # 'hours': Value, float containing work hours to be updated.
16223
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   340
    # 'fix':   If key present, bug is to be marked fixed. Value ignored.
16222
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
   341
16221
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   342
    def filter_real_bug_ids(self, bugs):
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   343
        '''remove bug IDs that do not exist in Bugzilla from bugs.'''
13800
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   344
        pass
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   345
16221
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   346
    def filter_cset_known_bug_ids(self, node, bugs):
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   347
        '''remove bug IDs where node occurs in comment text from bugs.'''
13800
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   348
        pass
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   349
16221
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   350
    def updatebug(self, bugid, newstate, text, committer):
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   351
        '''update the specified bug. Add comment text and set new states.
13800
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   352
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   353
        If possible add the comment as being from the committer of
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   354
        the changeset. Otherwise use the default Bugzilla user.
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   355
        '''
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   356
        pass
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   357
16221
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   358
    def notify(self, bugs, committer):
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   359
        '''Force sending of Bugzilla notification emails.
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   360
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   361
        Only required if the access method does not trigger notification
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   362
        emails automatically.
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   363
        '''
13800
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   364
        pass
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   365
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   366
# Bugzilla via direct access to MySQL database.
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   367
class bzmysql(bzaccess):
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   368
    '''Support for direct MySQL access to Bugzilla.
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   369
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   370
    The earliest Bugzilla version this is tested with is version 2.16.
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   371
16226
674ecd23c42c bugzilla: correct comment typo
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   372
    If your Bugzilla is version 3.4 or above, you are strongly
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   373
    recommended to use the XMLRPC access method instead.
13800
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   374
    '''
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   375
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   376
    @staticmethod
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   377
    def sql_buglist(ids):
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   378
        '''return SQL-friendly list of bug ids'''
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   379
        return '(' + ','.join(map(str, ids)) + ')'
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   380
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   381
    _MySQLdb = None
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   382
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   383
    def __init__(self, ui):
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   384
        try:
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   385
            import MySQLdb as mysql
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   386
            bzmysql._MySQLdb = mysql
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25186
diff changeset
   387
        except ImportError as err:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
   388
            raise error.Abort(_('python mysql support not available: %s') % err)
13800
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   389
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   390
        bzaccess.__init__(self, ui)
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   391
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   392
        host = self.ui.config('bugzilla', 'host', 'localhost')
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   393
        user = self.ui.config('bugzilla', 'user', 'bugs')
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   394
        passwd = self.ui.config('bugzilla', 'password')
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   395
        db = self.ui.config('bugzilla', 'db', 'bugs')
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   396
        timeout = int(self.ui.config('bugzilla', 'timeout', 5))
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   397
        self.ui.note(_('connecting to %s:%s as %s, password %s\n') %
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   398
                     (host, db, user, '*' * len(passwd)))
13800
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   399
        self.conn = bzmysql._MySQLdb.connect(host=host,
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   400
                                                   user=user, passwd=passwd,
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   401
                                                   db=db,
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   402
                                                   connect_timeout=timeout)
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   403
        self.cursor = self.conn.cursor()
7019
6b1ece890f9a Add support for Bugzilla 3.0 series to bugzilla hook.
Jim Hague <jim.hague@acm.org>
parents: 6762
diff changeset
   404
        self.longdesc_id = self.get_longdesc_id()
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   405
        self.user_ids = {}
7618
6c89dd0a7797 Bugzilla 2.18 and on use contrib/sendbugmail.pl, not processmail.
Jim Hague <jim.hague@acm.org>
parents: 7504
diff changeset
   406
        self.default_notify = "cd %(bzdir)s && ./processmail %(id)s %(user)s"
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   407
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   408
    def run(self, *args, **kwargs):
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   409
        '''run a query.'''
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   410
        self.ui.note(_('query: %s %s\n') % (args, kwargs))
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   411
        try:
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   412
            self.cursor.execute(*args, **kwargs)
13800
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   413
        except bzmysql._MySQLdb.MySQLError:
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   414
            self.ui.note(_('failed query: %s %s\n') % (args, kwargs))
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   415
            raise
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   416
7019
6b1ece890f9a Add support for Bugzilla 3.0 series to bugzilla hook.
Jim Hague <jim.hague@acm.org>
parents: 6762
diff changeset
   417
    def get_longdesc_id(self):
6b1ece890f9a Add support for Bugzilla 3.0 series to bugzilla hook.
Jim Hague <jim.hague@acm.org>
parents: 6762
diff changeset
   418
        '''get identity of longdesc field'''
6b1ece890f9a Add support for Bugzilla 3.0 series to bugzilla hook.
Jim Hague <jim.hague@acm.org>
parents: 6762
diff changeset
   419
        self.run('select fieldid from fielddefs where name = "longdesc"')
6b1ece890f9a Add support for Bugzilla 3.0 series to bugzilla hook.
Jim Hague <jim.hague@acm.org>
parents: 6762
diff changeset
   420
        ids = self.cursor.fetchall()
6b1ece890f9a Add support for Bugzilla 3.0 series to bugzilla hook.
Jim Hague <jim.hague@acm.org>
parents: 6762
diff changeset
   421
        if len(ids) != 1:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
   422
            raise error.Abort(_('unknown database schema'))
7019
6b1ece890f9a Add support for Bugzilla 3.0 series to bugzilla hook.
Jim Hague <jim.hague@acm.org>
parents: 6762
diff changeset
   423
        return ids[0][0]
6b1ece890f9a Add support for Bugzilla 3.0 series to bugzilla hook.
Jim Hague <jim.hague@acm.org>
parents: 6762
diff changeset
   424
16221
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   425
    def filter_real_bug_ids(self, bugs):
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   426
        '''filter not-existing bugs from set.'''
13800
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   427
        self.run('select bug_id from bugs where bug_id in %s' %
16221
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   428
                 bzmysql.sql_buglist(bugs.keys()))
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   429
        existing = [id for (id,) in self.cursor.fetchall()]
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   430
        for id in bugs.keys():
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   431
            if id not in existing:
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   432
                self.ui.status(_('bug %d does not exist\n') % id)
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   433
                del bugs[id]
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   434
16221
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   435
    def filter_cset_known_bug_ids(self, node, bugs):
13799
d04fc5582772 bugzilla: keep bug IDs in set.
Jim Hague <jim.hague@acm.org>
parents: 13798
diff changeset
   436
        '''filter bug ids that already refer to this changeset from set.'''
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   437
        self.run('''select bug_id from longdescs where
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   438
                    bug_id in %s and thetext like "%%%s%%"''' %
16221
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   439
                 (bzmysql.sql_buglist(bugs.keys()), short(node)))
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   440
        for (id,) in self.cursor.fetchall():
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   441
            self.ui.status(_('bug %d already knows about changeset %s\n') %
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   442
                           (id, short(node)))
16221
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   443
            del bugs[id]
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   444
16221
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   445
    def notify(self, bugs, committer):
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   446
        '''tell bugzilla to send mail.'''
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   447
        self.ui.status(_('telling bugzilla to send mail:\n'))
7618
6c89dd0a7797 Bugzilla 2.18 and on use contrib/sendbugmail.pl, not processmail.
Jim Hague <jim.hague@acm.org>
parents: 7504
diff changeset
   448
        (user, userid) = self.get_bugzilla_user(committer)
16221
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   449
        for id in bugs.keys():
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   450
            self.ui.status(_('  bug %s\n') % id)
7618
6c89dd0a7797 Bugzilla 2.18 and on use contrib/sendbugmail.pl, not processmail.
Jim Hague <jim.hague@acm.org>
parents: 7504
diff changeset
   451
            cmdfmt = self.ui.config('bugzilla', 'notify', self.default_notify)
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16649
diff changeset
   452
            bzdir = self.ui.config('bugzilla', 'bzdir',
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16649
diff changeset
   453
                                   '/var/www/html/bugzilla')
7618
6c89dd0a7797 Bugzilla 2.18 and on use contrib/sendbugmail.pl, not processmail.
Jim Hague <jim.hague@acm.org>
parents: 7504
diff changeset
   454
            try:
6c89dd0a7797 Bugzilla 2.18 and on use contrib/sendbugmail.pl, not processmail.
Jim Hague <jim.hague@acm.org>
parents: 7504
diff changeset
   455
                # Backwards-compatible with old notify string, which
6c89dd0a7797 Bugzilla 2.18 and on use contrib/sendbugmail.pl, not processmail.
Jim Hague <jim.hague@acm.org>
parents: 7504
diff changeset
   456
                # took one string. This will throw with a new format
6c89dd0a7797 Bugzilla 2.18 and on use contrib/sendbugmail.pl, not processmail.
Jim Hague <jim.hague@acm.org>
parents: 7504
diff changeset
   457
                # string.
6c89dd0a7797 Bugzilla 2.18 and on use contrib/sendbugmail.pl, not processmail.
Jim Hague <jim.hague@acm.org>
parents: 7504
diff changeset
   458
                cmd = cmdfmt % id
6c89dd0a7797 Bugzilla 2.18 and on use contrib/sendbugmail.pl, not processmail.
Jim Hague <jim.hague@acm.org>
parents: 7504
diff changeset
   459
            except TypeError:
6c89dd0a7797 Bugzilla 2.18 and on use contrib/sendbugmail.pl, not processmail.
Jim Hague <jim.hague@acm.org>
parents: 7504
diff changeset
   460
                cmd = cmdfmt % {'bzdir': bzdir, 'id': id, 'user': user}
6c89dd0a7797 Bugzilla 2.18 and on use contrib/sendbugmail.pl, not processmail.
Jim Hague <jim.hague@acm.org>
parents: 7504
diff changeset
   461
            self.ui.note(_('running notify command %s\n') % cmd)
6548
962eb403165b replace usage of os.popen() with util.popen()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6211
diff changeset
   462
            fp = util.popen('(%s) 2>&1' % cmd)
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   463
            out = fp.read()
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   464
            ret = fp.close()
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   465
            if ret:
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   466
                self.ui.warn(out)
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
   467
                raise error.Abort(_('bugzilla notify command %s') %
14234
600e64004eb5 rename explain_exit to explainexit
Adrian Buehlmann <adrian@cadifra.com>
parents: 13896
diff changeset
   468
                                 util.explainexit(ret)[0])
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   469
        self.ui.status(_('done\n'))
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   470
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   471
    def get_user_id(self, user):
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   472
        '''look up numeric bugzilla user id.'''
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   473
        try:
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   474
            return self.user_ids[user]
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   475
        except KeyError:
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   476
            try:
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   477
                userid = int(user)
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   478
            except ValueError:
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   479
                self.ui.note(_('looking up user %s\n') % user)
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   480
                self.run('''select userid from profiles
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   481
                            where login_name like %s''', user)
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   482
                all = self.cursor.fetchall()
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   483
                if len(all) != 1:
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   484
                    raise KeyError(user)
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   485
                userid = int(all[0][0])
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   486
            self.user_ids[user] = userid
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   487
            return userid
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   488
7618
6c89dd0a7797 Bugzilla 2.18 and on use contrib/sendbugmail.pl, not processmail.
Jim Hague <jim.hague@acm.org>
parents: 7504
diff changeset
   489
    def get_bugzilla_user(self, committer):
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   490
        '''See if committer is a registered bugzilla user. Return
7618
6c89dd0a7797 Bugzilla 2.18 and on use contrib/sendbugmail.pl, not processmail.
Jim Hague <jim.hague@acm.org>
parents: 7504
diff changeset
   491
        bugzilla username and userid if so. If not, return default
6c89dd0a7797 Bugzilla 2.18 and on use contrib/sendbugmail.pl, not processmail.
Jim Hague <jim.hague@acm.org>
parents: 7504
diff changeset
   492
        bugzilla username and userid.'''
2306
4c67ba93560b bugzilla: allow to map between committer email and bugzilla user name.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2239
diff changeset
   493
        user = self.map_committer(committer)
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   494
        try:
2306
4c67ba93560b bugzilla: allow to map between committer email and bugzilla user name.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2239
diff changeset
   495
            userid = self.get_user_id(user)
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   496
        except KeyError:
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   497
            try:
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   498
                defaultuser = self.ui.config('bugzilla', 'bzuser')
2306
4c67ba93560b bugzilla: allow to map between committer email and bugzilla user name.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2239
diff changeset
   499
                if not defaultuser:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
   500
                    raise error.Abort(_('cannot find bugzilla user id for %s') %
2306
4c67ba93560b bugzilla: allow to map between committer email and bugzilla user name.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2239
diff changeset
   501
                                     user)
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   502
                userid = self.get_user_id(defaultuser)
7618
6c89dd0a7797 Bugzilla 2.18 and on use contrib/sendbugmail.pl, not processmail.
Jim Hague <jim.hague@acm.org>
parents: 7504
diff changeset
   503
                user = defaultuser
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   504
            except KeyError:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
   505
                raise error.Abort(_('cannot find bugzilla user id for %s or %s')
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16649
diff changeset
   506
                                 % (user, defaultuser))
7618
6c89dd0a7797 Bugzilla 2.18 and on use contrib/sendbugmail.pl, not processmail.
Jim Hague <jim.hague@acm.org>
parents: 7504
diff changeset
   507
        return (user, userid)
6c89dd0a7797 Bugzilla 2.18 and on use contrib/sendbugmail.pl, not processmail.
Jim Hague <jim.hague@acm.org>
parents: 7504
diff changeset
   508
16221
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   509
    def updatebug(self, bugid, newstate, text, committer):
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   510
        '''update bug state with comment text.
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   511
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   512
        Try adding comment as committer of changeset, otherwise as
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   513
        default bugzilla user.'''
16222
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
   514
        if len(newstate) > 0:
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
   515
            self.ui.warn(_("Bugzilla/MySQL cannot update bug state\n"))
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
   516
7618
6c89dd0a7797 Bugzilla 2.18 and on use contrib/sendbugmail.pl, not processmail.
Jim Hague <jim.hague@acm.org>
parents: 7504
diff changeset
   517
        (user, userid) = self.get_bugzilla_user(committer)
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   518
        now = time.strftime('%Y-%m-%d %H:%M:%S')
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   519
        self.run('''insert into longdescs
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   520
                    (bug_id, who, bug_when, thetext)
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   521
                    values (%s, %s, %s, %s)''',
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   522
                 (bugid, userid, now, text))
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   523
        self.run('''insert into bugs_activity (bug_id, who, bug_when, fieldid)
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   524
                    values (%s, %s, %s, %s)''',
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   525
                 (bugid, userid, now, self.longdesc_id))
7493
518afef5e350 Fix Bugzilla integration to work with new Bugzilla 3.2.
Jim Hague <jim.hague@acm.org>
parents: 7369
diff changeset
   526
        self.conn.commit()
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   527
13800
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   528
class bzmysql_2_18(bzmysql):
7618
6c89dd0a7797 Bugzilla 2.18 and on use contrib/sendbugmail.pl, not processmail.
Jim Hague <jim.hague@acm.org>
parents: 7504
diff changeset
   529
    '''support for bugzilla 2.18 series.'''
6c89dd0a7797 Bugzilla 2.18 and on use contrib/sendbugmail.pl, not processmail.
Jim Hague <jim.hague@acm.org>
parents: 7504
diff changeset
   530
6c89dd0a7797 Bugzilla 2.18 and on use contrib/sendbugmail.pl, not processmail.
Jim Hague <jim.hague@acm.org>
parents: 7504
diff changeset
   531
    def __init__(self, ui):
13800
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   532
        bzmysql.__init__(self, ui)
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
   533
        self.default_notify = \
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
   534
            "cd %(bzdir)s && perl -T contrib/sendbugmail.pl %(id)s %(user)s"
7618
6c89dd0a7797 Bugzilla 2.18 and on use contrib/sendbugmail.pl, not processmail.
Jim Hague <jim.hague@acm.org>
parents: 7504
diff changeset
   535
13800
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   536
class bzmysql_3_0(bzmysql_2_18):
7019
6b1ece890f9a Add support for Bugzilla 3.0 series to bugzilla hook.
Jim Hague <jim.hague@acm.org>
parents: 6762
diff changeset
   537
    '''support for bugzilla 3.0 series.'''
6b1ece890f9a Add support for Bugzilla 3.0 series to bugzilla hook.
Jim Hague <jim.hague@acm.org>
parents: 6762
diff changeset
   538
6b1ece890f9a Add support for Bugzilla 3.0 series to bugzilla hook.
Jim Hague <jim.hague@acm.org>
parents: 6762
diff changeset
   539
    def __init__(self, ui):
13800
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   540
        bzmysql_2_18.__init__(self, ui)
7019
6b1ece890f9a Add support for Bugzilla 3.0 series to bugzilla hook.
Jim Hague <jim.hague@acm.org>
parents: 6762
diff changeset
   541
6b1ece890f9a Add support for Bugzilla 3.0 series to bugzilla hook.
Jim Hague <jim.hague@acm.org>
parents: 6762
diff changeset
   542
    def get_longdesc_id(self):
6b1ece890f9a Add support for Bugzilla 3.0 series to bugzilla hook.
Jim Hague <jim.hague@acm.org>
parents: 6762
diff changeset
   543
        '''get identity of longdesc field'''
6b1ece890f9a Add support for Bugzilla 3.0 series to bugzilla hook.
Jim Hague <jim.hague@acm.org>
parents: 6762
diff changeset
   544
        self.run('select id from fielddefs where name = "longdesc"')
6b1ece890f9a Add support for Bugzilla 3.0 series to bugzilla hook.
Jim Hague <jim.hague@acm.org>
parents: 6762
diff changeset
   545
        ids = self.cursor.fetchall()
6b1ece890f9a Add support for Bugzilla 3.0 series to bugzilla hook.
Jim Hague <jim.hague@acm.org>
parents: 6762
diff changeset
   546
        if len(ids) != 1:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
   547
            raise error.Abort(_('unknown database schema'))
7019
6b1ece890f9a Add support for Bugzilla 3.0 series to bugzilla hook.
Jim Hague <jim.hague@acm.org>
parents: 6762
diff changeset
   548
        return ids[0][0]
6b1ece890f9a Add support for Bugzilla 3.0 series to bugzilla hook.
Jim Hague <jim.hague@acm.org>
parents: 6762
diff changeset
   549
17424
e7cfe3587ea4 fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents: 16881
diff changeset
   550
# Bugzilla via XMLRPC interface.
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   551
15870
f4c859293ed4 bugzilla: make XMLRPC interface support http and https access
Jim Hague <jim.hague@acm.org>
parents: 14619
diff changeset
   552
class cookietransportrequest(object):
f4c859293ed4 bugzilla: make XMLRPC interface support http and https access
Jim Hague <jim.hague@acm.org>
parents: 14619
diff changeset
   553
    """A Transport request method that retains cookies over its lifetime.
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   554
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   555
    The regular xmlrpclib transports ignore cookies. Which causes
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   556
    a bit of a problem when you need a cookie-based login, as with
21542
d12d8d41428e bugzilla: support Bugzilla 4.4.3+ API login token authentication (issue4257)
Jim Hague <jim.hague@acm.org>
parents: 20673
diff changeset
   557
    the Bugzilla XMLRPC interface prior to 4.4.3.
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   558
15870
f4c859293ed4 bugzilla: make XMLRPC interface support http and https access
Jim Hague <jim.hague@acm.org>
parents: 14619
diff changeset
   559
    So this is a helper for defining a Transport which looks for
f4c859293ed4 bugzilla: make XMLRPC interface support http and https access
Jim Hague <jim.hague@acm.org>
parents: 14619
diff changeset
   560
    cookies being set in responses and saves them to add to all future
f4c859293ed4 bugzilla: make XMLRPC interface support http and https access
Jim Hague <jim.hague@acm.org>
parents: 14619
diff changeset
   561
    requests.
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   562
    """
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   563
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   564
    # Inspiration drawn from
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   565
    # http://blog.godson.in/2010/09/how-to-make-python-xmlrpclib-client.html
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   566
    # http://www.itkovian.net/base/transport-class-for-pythons-xml-rpc-lib/
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   567
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   568
    cookies = []
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   569
    def send_cookies(self, connection):
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   570
        if self.cookies:
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   571
            for cookie in self.cookies:
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   572
                connection.putheader("Cookie", cookie)
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   573
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   574
    def request(self, host, handler, request_body, verbose=0):
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   575
        self.verbose = verbose
16193
b468cea3f29d bugzilla: stop XMLRPC requests from requesting gzipped responses
Jim Hague <jim.hague@acm.org>
parents: 15870
diff changeset
   576
        self.accept_gzip_encoding = False
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   577
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   578
        # issue XML-RPC request
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   579
        h = self.make_connection(host)
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   580
        if verbose:
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   581
            h.set_debuglevel(1)
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   582
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   583
        self.send_request(h, handler, request_body)
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   584
        self.send_host(h, host)
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   585
        self.send_cookies(h)
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   586
        self.send_user_agent(h)
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   587
        self.send_content(h, request_body)
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   588
30478
f7d66746ec18 bugzilla: stop mentioning Pythons older than 2.6
Augie Fackler <augie@google.com>
parents: 29841
diff changeset
   589
        # Deal with differences between Python 2.6 and 2.7.
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   590
        # In the former h is a HTTP(S). In the latter it's a
30478
f7d66746ec18 bugzilla: stop mentioning Pythons older than 2.6
Augie Fackler <augie@google.com>
parents: 29841
diff changeset
   591
        # HTTP(S)Connection. Luckily, the 2.6 implementation of
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   592
        # HTTP(S) has an underlying HTTP(S)Connection, so extract
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   593
        # that and use it.
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   594
        try:
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   595
            response = h.getresponse()
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   596
        except AttributeError:
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   597
            response = h._conn.getresponse()
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   598
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   599
        # Add any cookie definitions to our list.
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   600
        for header in response.msg.getallmatchingheaders("Set-Cookie"):
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   601
            val = header.split(": ", 1)[1]
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   602
            cookie = val.split(";", 1)[0]
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   603
            self.cookies.append(cookie)
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   604
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   605
        if response.status != 200:
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   606
            raise xmlrpclib.ProtocolError(host + handler, response.status,
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   607
                                          response.reason, response.msg.headers)
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   608
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   609
        payload = response.read()
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   610
        parser, unmarshaller = self.getparser()
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   611
        parser.feed(payload)
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   612
        parser.close()
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   613
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   614
        return unmarshaller.close()
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   615
15870
f4c859293ed4 bugzilla: make XMLRPC interface support http and https access
Jim Hague <jim.hague@acm.org>
parents: 14619
diff changeset
   616
# The explicit calls to the underlying xmlrpclib __init__() methods are
f4c859293ed4 bugzilla: make XMLRPC interface support http and https access
Jim Hague <jim.hague@acm.org>
parents: 14619
diff changeset
   617
# necessary. The xmlrpclib.Transport classes are old-style classes, and
f4c859293ed4 bugzilla: make XMLRPC interface support http and https access
Jim Hague <jim.hague@acm.org>
parents: 14619
diff changeset
   618
# it turns out their __init__() doesn't get called when doing multiple
f4c859293ed4 bugzilla: make XMLRPC interface support http and https access
Jim Hague <jim.hague@acm.org>
parents: 14619
diff changeset
   619
# inheritance with a new-style class.
f4c859293ed4 bugzilla: make XMLRPC interface support http and https access
Jim Hague <jim.hague@acm.org>
parents: 14619
diff changeset
   620
class cookietransport(cookietransportrequest, xmlrpclib.Transport):
f4c859293ed4 bugzilla: make XMLRPC interface support http and https access
Jim Hague <jim.hague@acm.org>
parents: 14619
diff changeset
   621
    def __init__(self, use_datetime=0):
16649
822e75386c16 bugzilla: fix transport initialization on python 2.4
Steven Stallion <sstallion@gmail.com>
parents: 16227
diff changeset
   622
        if util.safehasattr(xmlrpclib.Transport, "__init__"):
822e75386c16 bugzilla: fix transport initialization on python 2.4
Steven Stallion <sstallion@gmail.com>
parents: 16227
diff changeset
   623
            xmlrpclib.Transport.__init__(self, use_datetime)
15870
f4c859293ed4 bugzilla: make XMLRPC interface support http and https access
Jim Hague <jim.hague@acm.org>
parents: 14619
diff changeset
   624
f4c859293ed4 bugzilla: make XMLRPC interface support http and https access
Jim Hague <jim.hague@acm.org>
parents: 14619
diff changeset
   625
class cookiesafetransport(cookietransportrequest, xmlrpclib.SafeTransport):
f4c859293ed4 bugzilla: make XMLRPC interface support http and https access
Jim Hague <jim.hague@acm.org>
parents: 14619
diff changeset
   626
    def __init__(self, use_datetime=0):
16649
822e75386c16 bugzilla: fix transport initialization on python 2.4
Steven Stallion <sstallion@gmail.com>
parents: 16227
diff changeset
   627
        if util.safehasattr(xmlrpclib.Transport, "__init__"):
822e75386c16 bugzilla: fix transport initialization on python 2.4
Steven Stallion <sstallion@gmail.com>
parents: 16227
diff changeset
   628
            xmlrpclib.SafeTransport.__init__(self, use_datetime)
15870
f4c859293ed4 bugzilla: make XMLRPC interface support http and https access
Jim Hague <jim.hague@acm.org>
parents: 14619
diff changeset
   629
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   630
class bzxmlrpc(bzaccess):
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   631
    """Support for access to Bugzilla via the Bugzilla XMLRPC API.
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   632
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   633
    Requires a minimum Bugzilla version 3.4.
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   634
    """
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   635
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   636
    def __init__(self, ui):
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   637
        bzaccess.__init__(self, ui)
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   638
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   639
        bzweb = self.ui.config('bugzilla', 'bzurl',
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   640
                               'http://localhost/bugzilla/')
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   641
        bzweb = bzweb.rstrip("/") + "/xmlrpc.cgi"
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   642
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   643
        user = self.ui.config('bugzilla', 'user', 'bugs')
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   644
        passwd = self.ui.config('bugzilla', 'password')
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   645
16223
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   646
        self.fixstatus = self.ui.config('bugzilla', 'fixstatus', 'RESOLVED')
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   647
        self.fixresolution = self.ui.config('bugzilla', 'fixresolution',
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   648
                                            'FIXED')
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   649
15870
f4c859293ed4 bugzilla: make XMLRPC interface support http and https access
Jim Hague <jim.hague@acm.org>
parents: 14619
diff changeset
   650
        self.bzproxy = xmlrpclib.ServerProxy(bzweb, self.transport(bzweb))
16224
d52a6b542db1 bugzilla: add xmlrpcemail submission for Bugzilla 3.6 email interface
Jim Hague <jim.hague@acm.org>
parents: 16223
diff changeset
   651
        ver = self.bzproxy.Bugzilla.version()['version'].split('.')
d52a6b542db1 bugzilla: add xmlrpcemail submission for Bugzilla 3.6 email interface
Jim Hague <jim.hague@acm.org>
parents: 16223
diff changeset
   652
        self.bzvermajor = int(ver[0])
d52a6b542db1 bugzilla: add xmlrpcemail submission for Bugzilla 3.6 email interface
Jim Hague <jim.hague@acm.org>
parents: 16223
diff changeset
   653
        self.bzverminor = int(ver[1])
21542
d12d8d41428e bugzilla: support Bugzilla 4.4.3+ API login token authentication (issue4257)
Jim Hague <jim.hague@acm.org>
parents: 20673
diff changeset
   654
        login = self.bzproxy.User.login({'login': user, 'password': passwd,
d12d8d41428e bugzilla: support Bugzilla 4.4.3+ API login token authentication (issue4257)
Jim Hague <jim.hague@acm.org>
parents: 20673
diff changeset
   655
                                         'restrict_login': True})
d12d8d41428e bugzilla: support Bugzilla 4.4.3+ API login token authentication (issue4257)
Jim Hague <jim.hague@acm.org>
parents: 20673
diff changeset
   656
        self.bztoken = login.get('token', '')
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   657
15870
f4c859293ed4 bugzilla: make XMLRPC interface support http and https access
Jim Hague <jim.hague@acm.org>
parents: 14619
diff changeset
   658
    def transport(self, uri):
31570
29fcfb981324 bugzilla: use util.urlreq.urlparse
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30923
diff changeset
   659
        if util.urlreq.urlparse(uri, "http")[0] == "https":
15870
f4c859293ed4 bugzilla: make XMLRPC interface support http and https access
Jim Hague <jim.hague@acm.org>
parents: 14619
diff changeset
   660
            return cookiesafetransport()
f4c859293ed4 bugzilla: make XMLRPC interface support http and https access
Jim Hague <jim.hague@acm.org>
parents: 14619
diff changeset
   661
        else:
f4c859293ed4 bugzilla: make XMLRPC interface support http and https access
Jim Hague <jim.hague@acm.org>
parents: 14619
diff changeset
   662
            return cookietransport()
f4c859293ed4 bugzilla: make XMLRPC interface support http and https access
Jim Hague <jim.hague@acm.org>
parents: 14619
diff changeset
   663
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   664
    def get_bug_comments(self, id):
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   665
        """Return a string with all comment text for a bug."""
20673
37cde285b89c bugzilla: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 20667
diff changeset
   666
        c = self.bzproxy.Bug.comments({'ids': [id],
21542
d12d8d41428e bugzilla: support Bugzilla 4.4.3+ API login token authentication (issue4257)
Jim Hague <jim.hague@acm.org>
parents: 20673
diff changeset
   667
                                       'include_fields': ['text'],
d12d8d41428e bugzilla: support Bugzilla 4.4.3+ API login token authentication (issue4257)
Jim Hague <jim.hague@acm.org>
parents: 20673
diff changeset
   668
                                       'token': self.bztoken})
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   669
        return ''.join([t['text'] for t in c['bugs'][str(id)]['comments']])
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   670
16221
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   671
    def filter_real_bug_ids(self, bugs):
20673
37cde285b89c bugzilla: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 20667
diff changeset
   672
        probe = self.bzproxy.Bug.get({'ids': sorted(bugs.keys()),
37cde285b89c bugzilla: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 20667
diff changeset
   673
                                      'include_fields': [],
37cde285b89c bugzilla: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 20667
diff changeset
   674
                                      'permissive': True,
21542
d12d8d41428e bugzilla: support Bugzilla 4.4.3+ API login token authentication (issue4257)
Jim Hague <jim.hague@acm.org>
parents: 20673
diff changeset
   675
                                      'token': self.bztoken,
20673
37cde285b89c bugzilla: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 20667
diff changeset
   676
                                      })
16221
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   677
        for badbug in probe['faults']:
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   678
            id = badbug['id']
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   679
            self.ui.status(_('bug %d does not exist\n') % id)
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   680
            del bugs[id]
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   681
16221
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   682
    def filter_cset_known_bug_ids(self, node, bugs):
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   683
        for id in sorted(bugs.keys()):
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   684
            if self.get_bug_comments(id).find(short(node)) != -1:
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   685
                self.ui.status(_('bug %d already knows about changeset %s\n') %
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   686
                               (id, short(node)))
16221
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   687
                del bugs[id]
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   688
16221
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   689
    def updatebug(self, bugid, newstate, text, committer):
16223
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   690
        args = {}
16222
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
   691
        if 'hours' in newstate:
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
   692
            args['work_time'] = newstate['hours']
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   693
16223
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   694
        if self.bzvermajor >= 4:
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   695
            args['ids'] = [bugid]
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   696
            args['comment'] = {'body' : text}
16876
fdc879042414 bugzilla: stop bugs always being marked as fixed in xmlrpc (issue3484)
Jim Hague <jim.hague@acm.org>
parents: 16649
diff changeset
   697
            if 'fix' in newstate:
fdc879042414 bugzilla: stop bugs always being marked as fixed in xmlrpc (issue3484)
Jim Hague <jim.hague@acm.org>
parents: 16649
diff changeset
   698
                args['status'] = self.fixstatus
fdc879042414 bugzilla: stop bugs always being marked as fixed in xmlrpc (issue3484)
Jim Hague <jim.hague@acm.org>
parents: 16649
diff changeset
   699
                args['resolution'] = self.fixresolution
21542
d12d8d41428e bugzilla: support Bugzilla 4.4.3+ API login token authentication (issue4257)
Jim Hague <jim.hague@acm.org>
parents: 20673
diff changeset
   700
            args['token'] = self.bztoken
16223
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   701
            self.bzproxy.Bug.update(args)
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   702
        else:
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   703
            if 'fix' in newstate:
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   704
                self.ui.warn(_("Bugzilla/XMLRPC needs Bugzilla 4.0 or later "
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   705
                               "to mark bugs fixed\n"))
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   706
            args['id'] = bugid
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   707
            args['comment'] = text
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   708
            self.bzproxy.Bug.add_comment(args)
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   709
13802
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   710
class bzxmlrpcemail(bzxmlrpc):
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   711
    """Read data from Bugzilla via XMLRPC, send updates via email.
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   712
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   713
    Advantages of sending updates via email:
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   714
      1. Comments can be added as any user, not just logged in user.
16222
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
   715
      2. Bug statuses or other fields not accessible via XMLRPC can
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
   716
         potentially be updated.
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
   717
16223
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   718
    There is no XMLRPC function to change bug status before Bugzilla
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   719
    4.0, so bugs cannot be marked fixed via XMLRPC before Bugzilla 4.0.
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   720
    But bugs can be marked fixed via email from 3.4 onwards.
13802
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   721
    """
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   722
16224
d52a6b542db1 bugzilla: add xmlrpcemail submission for Bugzilla 3.6 email interface
Jim Hague <jim.hague@acm.org>
parents: 16223
diff changeset
   723
    # The email interface changes subtly between 3.4 and 3.6. In 3.4,
d52a6b542db1 bugzilla: add xmlrpcemail submission for Bugzilla 3.6 email interface
Jim Hague <jim.hague@acm.org>
parents: 16223
diff changeset
   724
    # in-email fields are specified as '@<fieldname> = <value>'. In
d52a6b542db1 bugzilla: add xmlrpcemail submission for Bugzilla 3.6 email interface
Jim Hague <jim.hague@acm.org>
parents: 16223
diff changeset
   725
    # 3.6 this becomes '@<fieldname> <value>'. And fieldname @bug_id
d52a6b542db1 bugzilla: add xmlrpcemail submission for Bugzilla 3.6 email interface
Jim Hague <jim.hague@acm.org>
parents: 16223
diff changeset
   726
    # in 3.4 becomes @id in 3.6. 3.6 and 4.0 both maintain backwards
d52a6b542db1 bugzilla: add xmlrpcemail submission for Bugzilla 3.6 email interface
Jim Hague <jim.hague@acm.org>
parents: 16223
diff changeset
   727
    # compatibility, but rather than rely on this use the new format for
d52a6b542db1 bugzilla: add xmlrpcemail submission for Bugzilla 3.6 email interface
Jim Hague <jim.hague@acm.org>
parents: 16223
diff changeset
   728
    # 4.0 onwards.
d52a6b542db1 bugzilla: add xmlrpcemail submission for Bugzilla 3.6 email interface
Jim Hague <jim.hague@acm.org>
parents: 16223
diff changeset
   729
13802
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   730
    def __init__(self, ui):
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   731
        bzxmlrpc.__init__(self, ui)
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   732
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   733
        self.bzemail = self.ui.config('bugzilla', 'bzemail')
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   734
        if not self.bzemail:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
   735
            raise error.Abort(_("configuration 'bzemail' missing"))
13802
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   736
        mail.validateconfig(self.ui)
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   737
16224
d52a6b542db1 bugzilla: add xmlrpcemail submission for Bugzilla 3.6 email interface
Jim Hague <jim.hague@acm.org>
parents: 16223
diff changeset
   738
    def makecommandline(self, fieldname, value):
d52a6b542db1 bugzilla: add xmlrpcemail submission for Bugzilla 3.6 email interface
Jim Hague <jim.hague@acm.org>
parents: 16223
diff changeset
   739
        if self.bzvermajor >= 4:
d52a6b542db1 bugzilla: add xmlrpcemail submission for Bugzilla 3.6 email interface
Jim Hague <jim.hague@acm.org>
parents: 16223
diff changeset
   740
            return "@%s %s" % (fieldname, str(value))
d52a6b542db1 bugzilla: add xmlrpcemail submission for Bugzilla 3.6 email interface
Jim Hague <jim.hague@acm.org>
parents: 16223
diff changeset
   741
        else:
d52a6b542db1 bugzilla: add xmlrpcemail submission for Bugzilla 3.6 email interface
Jim Hague <jim.hague@acm.org>
parents: 16223
diff changeset
   742
            if fieldname == "id":
d52a6b542db1 bugzilla: add xmlrpcemail submission for Bugzilla 3.6 email interface
Jim Hague <jim.hague@acm.org>
parents: 16223
diff changeset
   743
                fieldname = "bug_id"
d52a6b542db1 bugzilla: add xmlrpcemail submission for Bugzilla 3.6 email interface
Jim Hague <jim.hague@acm.org>
parents: 16223
diff changeset
   744
            return "@%s = %s" % (fieldname, str(value))
d52a6b542db1 bugzilla: add xmlrpcemail submission for Bugzilla 3.6 email interface
Jim Hague <jim.hague@acm.org>
parents: 16223
diff changeset
   745
13802
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   746
    def send_bug_modify_email(self, bugid, commands, comment, committer):
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   747
        '''send modification message to Bugzilla bug via email.
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   748
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   749
        The message format is documented in the Bugzilla email_in.pl
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   750
        specification. commands is a list of command lines, comment is the
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   751
        comment text.
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   752
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   753
        To stop users from crafting commit comments with
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   754
        Bugzilla commands, specify the bug ID via the message body, rather
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   755
        than the subject line, and leave a blank line after it.
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   756
        '''
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   757
        user = self.map_committer(committer)
21542
d12d8d41428e bugzilla: support Bugzilla 4.4.3+ API login token authentication (issue4257)
Jim Hague <jim.hague@acm.org>
parents: 20673
diff changeset
   758
        matches = self.bzproxy.User.get({'match': [user],
d12d8d41428e bugzilla: support Bugzilla 4.4.3+ API login token authentication (issue4257)
Jim Hague <jim.hague@acm.org>
parents: 20673
diff changeset
   759
                                         'token': self.bztoken})
13802
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   760
        if not matches['users']:
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   761
            user = self.ui.config('bugzilla', 'user', 'bugs')
21542
d12d8d41428e bugzilla: support Bugzilla 4.4.3+ API login token authentication (issue4257)
Jim Hague <jim.hague@acm.org>
parents: 20673
diff changeset
   762
            matches = self.bzproxy.User.get({'match': [user],
d12d8d41428e bugzilla: support Bugzilla 4.4.3+ API login token authentication (issue4257)
Jim Hague <jim.hague@acm.org>
parents: 20673
diff changeset
   763
                                             'token': self.bztoken})
13802
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   764
            if not matches['users']:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
   765
                raise error.Abort(_("default bugzilla user %s email not found")
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
   766
                                  % user)
13802
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   767
        user = matches['users'][0]['email']
16224
d52a6b542db1 bugzilla: add xmlrpcemail submission for Bugzilla 3.6 email interface
Jim Hague <jim.hague@acm.org>
parents: 16223
diff changeset
   768
        commands.append(self.makecommandline("id", bugid))
13802
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   769
16224
d52a6b542db1 bugzilla: add xmlrpcemail submission for Bugzilla 3.6 email interface
Jim Hague <jim.hague@acm.org>
parents: 16223
diff changeset
   770
        text = "\n".join(commands) + "\n\n" + comment
13802
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   771
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   772
        _charsets = mail._charsets(self.ui)
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   773
        user = mail.addressencode(self.ui, user, _charsets)
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   774
        bzemail = mail.addressencode(self.ui, self.bzemail, _charsets)
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   775
        msg = mail.mimeencode(self.ui, text, _charsets)
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   776
        msg['From'] = user
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   777
        msg['To'] = bzemail
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   778
        msg['Subject'] = mail.headencode(self.ui, "Bug modification", _charsets)
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   779
        sendmail = mail.connect(self.ui)
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   780
        sendmail(user, bzemail, msg.as_string())
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   781
16221
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   782
    def updatebug(self, bugid, newstate, text, committer):
16222
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
   783
        cmds = []
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
   784
        if 'hours' in newstate:
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
   785
            cmds.append(self.makecommandline("work_time", newstate['hours']))
16223
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   786
        if 'fix' in newstate:
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   787
            cmds.append(self.makecommandline("bug_status", self.fixstatus))
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   788
            cmds.append(self.makecommandline("resolution", self.fixresolution))
16222
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
   789
        self.send_bug_modify_email(bugid, cmds, text, committer)
13802
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   790
30923
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   791
class NotFound(LookupError):
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   792
    pass
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   793
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   794
class bzrestapi(bzaccess):
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   795
    """Read and write bugzilla data using the REST API available since
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   796
    Bugzilla 5.0.
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   797
    """
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   798
    def __init__(self, ui):
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   799
        bzaccess.__init__(self, ui)
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   800
        bz = self.ui.config('bugzilla', 'bzurl',
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   801
                            'http://localhost/bugzilla/')
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   802
        self.bzroot = '/'.join([bz, 'rest'])
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   803
        self.apikey = self.ui.config('bugzilla', 'apikey', '')
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   804
        self.user = self.ui.config('bugzilla', 'user', 'bugs')
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   805
        self.passwd = self.ui.config('bugzilla', 'password')
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   806
        self.fixstatus = self.ui.config('bugzilla', 'fixstatus', 'RESOLVED')
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   807
        self.fixresolution = self.ui.config('bugzilla', 'fixresolution',
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   808
                                            'FIXED')
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   809
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   810
    def apiurl(self, targets, include_fields=None):
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   811
        url = '/'.join([self.bzroot] + [str(t) for t in targets])
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   812
        qv = {}
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   813
        if self.apikey:
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   814
            qv['api_key'] = self.apikey
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   815
        elif self.user and self.passwd:
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   816
            qv['login'] = self.user
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   817
            qv['password'] = self.passwd
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   818
        if include_fields:
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   819
            qv['include_fields'] = include_fields
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   820
        if qv:
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   821
            url = '%s?%s' % (url, util.urlreq.urlencode(qv))
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   822
        return url
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   823
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   824
    def _fetch(self, burl):
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   825
        try:
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   826
            resp = url.open(self.ui, burl)
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   827
            return json.loads(resp.read())
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   828
        except util.urlerr.httperror as inst:
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   829
            if inst.code == 401:
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   830
                raise error.Abort(_('authorization failed'))
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   831
            if inst.code == 404:
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   832
                raise NotFound()
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   833
            else:
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   834
                raise
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   835
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   836
    def _submit(self, burl, data, method='POST'):
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   837
        data = json.dumps(data)
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   838
        if method == 'PUT':
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   839
            class putrequest(util.urlreq.request):
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   840
                def get_method(self):
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   841
                    return 'PUT'
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   842
            request_type = putrequest
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   843
        else:
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   844
            request_type = util.urlreq.request
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   845
        req = request_type(burl, data,
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   846
                           {'Content-Type': 'application/json'})
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   847
        try:
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   848
            resp = url.opener(self.ui).open(req)
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   849
            return json.loads(resp.read())
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   850
        except util.urlerr.httperror as inst:
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   851
            if inst.code == 401:
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   852
                raise error.Abort(_('authorization failed'))
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   853
            if inst.code == 404:
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   854
                raise NotFound()
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   855
            else:
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   856
                raise
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   857
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   858
    def filter_real_bug_ids(self, bugs):
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   859
        '''remove bug IDs that do not exist in Bugzilla from bugs.'''
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   860
        badbugs = set()
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   861
        for bugid in bugs:
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   862
            burl = self.apiurl(('bug', bugid), include_fields='status')
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   863
            try:
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   864
                self._fetch(burl)
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   865
            except NotFound:
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   866
                badbugs.add(bugid)
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   867
        for bugid in badbugs:
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   868
            del bugs[bugid]
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   869
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   870
    def filter_cset_known_bug_ids(self, node, bugs):
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   871
        '''remove bug IDs where node occurs in comment text from bugs.'''
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   872
        sn = short(node)
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   873
        for bugid in bugs.keys():
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   874
            burl = self.apiurl(('bug', bugid, 'comment'), include_fields='text')
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   875
            result = self._fetch(burl)
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   876
            comments = result['bugs'][str(bugid)]['comments']
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   877
            if any(sn in c['text'] for c in comments):
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   878
                self.ui.status(_('bug %d already knows about changeset %s\n') %
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   879
                               (bugid, sn))
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   880
                del bugs[bugid]
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   881
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   882
    def updatebug(self, bugid, newstate, text, committer):
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   883
        '''update the specified bug. Add comment text and set new states.
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   884
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   885
        If possible add the comment as being from the committer of
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   886
        the changeset. Otherwise use the default Bugzilla user.
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   887
        '''
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   888
        bugmod = {}
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   889
        if 'hours' in newstate:
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   890
            bugmod['work_time'] = newstate['hours']
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   891
        if 'fix' in newstate:
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   892
            bugmod['status'] = self.fixstatus
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   893
            bugmod['resolution'] = self.fixresolution
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   894
        if bugmod:
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   895
            # if we have to change the bugs state do it here
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   896
            bugmod['comment'] = {
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   897
                'comment': text,
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   898
                'is_private': False,
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   899
                'is_markdown': False,
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   900
            }
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   901
            burl = self.apiurl(('bug', bugid))
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   902
            self._submit(burl, bugmod, method='PUT')
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   903
            self.ui.debug('updated bug %s\n' % bugid)
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   904
        else:
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   905
            burl = self.apiurl(('bug', bugid, 'comment'))
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   906
            self._submit(burl, {
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   907
                'comment': text,
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   908
                'is_private': False,
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   909
                'is_markdown': False,
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   910
            })
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   911
            self.ui.debug('added comment to bug %s\n' % bugid)
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   912
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   913
    def notify(self, bugs, committer):
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   914
        '''Force sending of Bugzilla notification emails.
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   915
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   916
        Only required if the access method does not trigger notification
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   917
        emails automatically.
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   918
        '''
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   919
        pass
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   920
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   921
class bugzilla(object):
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   922
    # supported versions of bugzilla. different versions have
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   923
    # different schemas.
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   924
    _versions = {
13800
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   925
        '2.16': bzmysql,
c2ef8159dabe bugzilla: localise all MySQL direct access inside access class.
Jim Hague <jim.hague@acm.org>
parents: 13799
diff changeset
   926
        '2.18': bzmysql_2_18,
13801
60256f7f30c1 bugzilla: add XMLRPC interface.
Jim Hague <jim.hague@acm.org>
parents: 13800
diff changeset
   927
        '3.0':  bzmysql_3_0,
13802
49b5a1aaf726 bugzilla: add modified XMLRPC mode that uses email to send bug comments.
Jim Hague <jim.hague@acm.org>
parents: 13801
diff changeset
   928
        'xmlrpc': bzxmlrpc,
30923
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   929
        'xmlrpc+email': bzxmlrpcemail,
78de43ab585f bugzilla: add a rest api backend (usable with bugzilla 5.0+)
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 30478
diff changeset
   930
        'restapi': bzrestapi,
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   931
        }
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   932
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   933
    _default_bug_re = (r'bugs?\s*,?\s*(?:#|nos?\.?|num(?:ber)?s?)?\s*'
16222
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
   934
                       r'(?P<ids>(?:\d+\s*(?:,?\s*(?:and)?)?\s*)+)'
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
   935
                       r'\.?\s*(?:h(?:ours?)?\s*(?P<hours>\d*(?:\.\d+)?))?')
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   936
16223
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   937
    _default_fix_re = (r'fix(?:es)?\s*(?:bugs?\s*)?,?\s*'
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   938
                       r'(?:nos?\.?|num(?:ber)?s?)?\s*'
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   939
                       r'(?P<ids>(?:#?\d+\s*(?:,?\s*(?:and)?)?\s*)+)'
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   940
                       r'\.?\s*(?:h(?:ours?)?\s*(?P<hours>\d*(?:\.\d+)?))?')
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   941
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   942
    def __init__(self, ui, repo):
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   943
        self.ui = ui
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   944
        self.repo = repo
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   945
21855
1eda3e556845 bugzilla: stop trying to cache setup across hook invocation
Jim Hague <jim.hague@acm.org>
parents: 21842
diff changeset
   946
        bzversion = self.ui.config('bugzilla', 'version')
1eda3e556845 bugzilla: stop trying to cache setup across hook invocation
Jim Hague <jim.hague@acm.org>
parents: 21842
diff changeset
   947
        try:
1eda3e556845 bugzilla: stop trying to cache setup across hook invocation
Jim Hague <jim.hague@acm.org>
parents: 21842
diff changeset
   948
            bzclass = bugzilla._versions[bzversion]
1eda3e556845 bugzilla: stop trying to cache setup across hook invocation
Jim Hague <jim.hague@acm.org>
parents: 21842
diff changeset
   949
        except KeyError:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
   950
            raise error.Abort(_('bugzilla version %s not supported') %
21855
1eda3e556845 bugzilla: stop trying to cache setup across hook invocation
Jim Hague <jim.hague@acm.org>
parents: 21842
diff changeset
   951
                             bzversion)
1eda3e556845 bugzilla: stop trying to cache setup across hook invocation
Jim Hague <jim.hague@acm.org>
parents: 21842
diff changeset
   952
        self.bzdriver = bzclass(self.ui)
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   953
21855
1eda3e556845 bugzilla: stop trying to cache setup across hook invocation
Jim Hague <jim.hague@acm.org>
parents: 21842
diff changeset
   954
        self.bug_re = re.compile(
1eda3e556845 bugzilla: stop trying to cache setup across hook invocation
Jim Hague <jim.hague@acm.org>
parents: 21842
diff changeset
   955
            self.ui.config('bugzilla', 'regexp',
1eda3e556845 bugzilla: stop trying to cache setup across hook invocation
Jim Hague <jim.hague@acm.org>
parents: 21842
diff changeset
   956
                           bugzilla._default_bug_re), re.IGNORECASE)
1eda3e556845 bugzilla: stop trying to cache setup across hook invocation
Jim Hague <jim.hague@acm.org>
parents: 21842
diff changeset
   957
        self.fix_re = re.compile(
1eda3e556845 bugzilla: stop trying to cache setup across hook invocation
Jim Hague <jim.hague@acm.org>
parents: 21842
diff changeset
   958
            self.ui.config('bugzilla', 'fixregexp',
1eda3e556845 bugzilla: stop trying to cache setup across hook invocation
Jim Hague <jim.hague@acm.org>
parents: 21842
diff changeset
   959
                           bugzilla._default_fix_re), re.IGNORECASE)
1eda3e556845 bugzilla: stop trying to cache setup across hook invocation
Jim Hague <jim.hague@acm.org>
parents: 21842
diff changeset
   960
        self.split_re = re.compile(r'\D+')
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   961
16221
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   962
    def find_bugs(self, ctx):
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   963
        '''return bugs dictionary created from commit comment.
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   964
16221
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   965
        Extract bug info from changeset comments. Filter out any that are
13799
d04fc5582772 bugzilla: keep bug IDs in set.
Jim Hague <jim.hague@acm.org>
parents: 13798
diff changeset
   966
        not known to Bugzilla, and any that already have a reference to
d04fc5582772 bugzilla: keep bug IDs in set.
Jim Hague <jim.hague@acm.org>
parents: 13798
diff changeset
   967
        the given changeset in their comments.
d04fc5582772 bugzilla: keep bug IDs in set.
Jim Hague <jim.hague@acm.org>
parents: 13798
diff changeset
   968
        '''
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   969
        start = 0
16222
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
   970
        hours = 0.0
16221
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
   971
        bugs = {}
21855
1eda3e556845 bugzilla: stop trying to cache setup across hook invocation
Jim Hague <jim.hague@acm.org>
parents: 21842
diff changeset
   972
        bugmatch = self.bug_re.search(ctx.description(), start)
1eda3e556845 bugzilla: stop trying to cache setup across hook invocation
Jim Hague <jim.hague@acm.org>
parents: 21842
diff changeset
   973
        fixmatch = self.fix_re.search(ctx.description(), start)
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   974
        while True:
16222
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
   975
            bugattribs = {}
16223
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   976
            if not bugmatch and not fixmatch:
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   977
                break
16223
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   978
            if not bugmatch:
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   979
                m = fixmatch
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   980
            elif not fixmatch:
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   981
                m = bugmatch
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   982
            else:
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   983
                if bugmatch.start() < fixmatch.start():
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   984
                    m = bugmatch
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   985
                else:
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   986
                    m = fixmatch
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   987
            start = m.end()
16223
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   988
            if m is bugmatch:
21855
1eda3e556845 bugzilla: stop trying to cache setup across hook invocation
Jim Hague <jim.hague@acm.org>
parents: 21842
diff changeset
   989
                bugmatch = self.bug_re.search(ctx.description(), start)
16223
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   990
                if 'fix' in bugattribs:
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   991
                    del bugattribs['fix']
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   992
            else:
21855
1eda3e556845 bugzilla: stop trying to cache setup across hook invocation
Jim Hague <jim.hague@acm.org>
parents: 21842
diff changeset
   993
                fixmatch = self.fix_re.search(ctx.description(), start)
16223
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   994
                bugattribs['fix'] = None
ac4fd3238ead bugzilla: allow change comment to mark bugs fixed
Jim Hague <jim.hague@acm.org>
parents: 16222
diff changeset
   995
16222
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
   996
            try:
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
   997
                ids = m.group('ids')
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
   998
            except IndexError:
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
   999
                ids = m.group(1)
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
  1000
            try:
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
  1001
                hours = float(m.group('hours'))
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
  1002
                bugattribs['hours'] = hours
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
  1003
            except IndexError:
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
  1004
                pass
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
  1005
            except TypeError:
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
  1006
                pass
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
  1007
            except ValueError:
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
  1008
                self.ui.status(_("%s: invalid hours\n") % m.group('hours'))
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
  1009
21855
1eda3e556845 bugzilla: stop trying to cache setup across hook invocation
Jim Hague <jim.hague@acm.org>
parents: 21842
diff changeset
  1010
            for id in self.split_re.split(ids):
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
  1011
                if not id:
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
  1012
                    continue
16222
d7b7b453c035 bugzilla: extract optional hours from commit message and update bug time
Jim Hague <jim.hague@acm.org>
parents: 16221
diff changeset
  1013
                bugs[int(id)] = bugattribs
16221
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
  1014
        if bugs:
21855
1eda3e556845 bugzilla: stop trying to cache setup across hook invocation
Jim Hague <jim.hague@acm.org>
parents: 21842
diff changeset
  1015
            self.bzdriver.filter_real_bug_ids(bugs)
16221
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
  1016
        if bugs:
21855
1eda3e556845 bugzilla: stop trying to cache setup across hook invocation
Jim Hague <jim.hague@acm.org>
parents: 21842
diff changeset
  1017
            self.bzdriver.filter_cset_known_bug_ids(ctx.node(), bugs)
16221
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
  1018
        return bugs
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1019
16221
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
  1020
    def update(self, bugid, newstate, ctx):
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1021
        '''update bugzilla bug with reference to changeset.'''
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1022
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1023
        def webroot(root):
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1024
            '''strip leading prefix of repo root and turn into
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1025
            url-safe path.'''
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1026
            count = int(self.ui.config('bugzilla', 'strip', 0))
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1027
            root = util.pconvert(root)
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1028
            while count > 0:
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1029
                c = root.find('/')
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1030
                if c == -1:
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1031
                    break
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
  1032
                root = root[c + 1:]
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1033
                count -= 1
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1034
            return root
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1035
28950
9e1c9f016b72 bugzilla: do not load style file if template is specified (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 28091
diff changeset
  1036
        mapfile = None
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1037
        tmpl = self.ui.config('bugzilla', 'template')
28950
9e1c9f016b72 bugzilla: do not load style file if template is specified (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 28091
diff changeset
  1038
        if not tmpl:
9e1c9f016b72 bugzilla: do not load style file if template is specified (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 28091
diff changeset
  1039
            mapfile = self.ui.config('bugzilla', 'style')
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1040
        if not mapfile and not tmpl:
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1041
            tmpl = _('changeset {node|short} in repo {root} refers '
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1042
                     'to bug {bug}.\ndetails:\n\t{desc|tabindent}')
32839
b425ec7fb7f6 cmdutil: pass templatespec tuple directly to changeset_templater (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32574
diff changeset
  1043
        spec = cmdutil.logtemplatespec(tmpl, mapfile)
b425ec7fb7f6 cmdutil: pass templatespec tuple directly to changeset_templater (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32574
diff changeset
  1044
        t = cmdutil.changeset_templater(self.ui, self.repo, spec,
b425ec7fb7f6 cmdutil: pass templatespec tuple directly to changeset_templater (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32574
diff changeset
  1045
                                        False, None, False)
3741
0897bf8d54c7 update bugzilla extension to use ui buffers
Matt Mackall <mpm@selenic.com>
parents: 3643
diff changeset
  1046
        self.ui.pushbuffer()
7369
87158be081b8 cmdutil: use change contexts for cset-printer and cset-templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7280
diff changeset
  1047
        t.show(ctx, changes=ctx.changeset(),
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1048
               bug=str(bugid),
2197
5de8b44f0446 define standard name for base url to use when printing hgweb urls.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2192
diff changeset
  1049
               hgweb=self.ui.config('web', 'baseurl'),
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1050
               root=self.repo.root,
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1051
               webroot=webroot(self.repo.root))
3741
0897bf8d54c7 update bugzilla extension to use ui buffers
Matt Mackall <mpm@selenic.com>
parents: 3643
diff changeset
  1052
        data = self.ui.popbuffer()
21855
1eda3e556845 bugzilla: stop trying to cache setup across hook invocation
Jim Hague <jim.hague@acm.org>
parents: 21842
diff changeset
  1053
        self.bzdriver.updatebug(bugid, newstate, data, util.email(ctx.user()))
1eda3e556845 bugzilla: stop trying to cache setup across hook invocation
Jim Hague <jim.hague@acm.org>
parents: 21842
diff changeset
  1054
1eda3e556845 bugzilla: stop trying to cache setup across hook invocation
Jim Hague <jim.hague@acm.org>
parents: 21842
diff changeset
  1055
    def notify(self, bugs, committer):
1eda3e556845 bugzilla: stop trying to cache setup across hook invocation
Jim Hague <jim.hague@acm.org>
parents: 21842
diff changeset
  1056
        '''ensure Bugzilla users are notified of bug change.'''
1eda3e556845 bugzilla: stop trying to cache setup across hook invocation
Jim Hague <jim.hague@acm.org>
parents: 21842
diff changeset
  1057
        self.bzdriver.notify(bugs, committer)
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1058
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1059
def hook(ui, repo, hooktype, node=None, **kwargs):
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1060
    '''add comment to bugzilla for each changeset that refers to a
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1061
    bugzilla bug id. only add a comment once per bug, so same change
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1062
    seen multiple times does not fill bug with duplicate data.'''
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1063
    if node is None:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1064
        raise error.Abort(_('hook type %s does not pass a changeset id') %
2192
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1065
                         hooktype)
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1066
    try:
2be3ac7abc21 add bugzilla integration hook. example of writing hook in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1067
        bz = bugzilla(ui, repo)
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6548
diff changeset
  1068
        ctx = repo[node]
16221
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
  1069
        bugs = bz.find_bugs(ctx)
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
  1070
        if bugs:
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
  1071
            for bug in bugs:
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
  1072
                bz.update(bug, bugs[bug], ctx)
4fc9fcd991c1 bugzilla: modify access interface to include new bug states
Jim Hague <jim.hague@acm.org>
parents: 16193
diff changeset
  1073
            bz.notify(bugs, util.email(ctx.user()))
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25186
diff changeset
  1074
    except Exception as e:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1075
        raise error.Abort(_('Bugzilla error: %s') % e)