##// END OF EJS Templates
readme chapter about keyring problems
Marcin Kasperski -
r255:4adf72b2 default
parent child Browse files
Show More
@@ -1,349 +1,406 b''
1 .. -*- mode: rst; compile-command: "rst2html README.txt README.html" -*-
1 .. -*- mode: rst; compile-command: "rst2html README.txt README.html" -*-
2
2
3 =======================================================
3 =======================================================
4 Mercurial Keyring
4 Mercurial Keyring
5 =======================================================
5 =======================================================
6
6
7 Mercurial Keyring is a Mercurial_ extension used to securely save HTTP
7 Mercurial Keyring is a Mercurial_ extension used to securely save HTTP
8 and SMTP authentication passwords in password databases (Gnome
8 and SMTP authentication passwords in password databases (Gnome
9 Keyring, KDE KWallet, OSXKeyChain, Windows Vault etc).
9 Keyring, KDE KWallet, OSXKeyChain, Windows Vault etc).
10
10
11 With ``mercurial_keyring`` active, Mercurial remembers your passwords
11 With ``mercurial_keyring`` active, Mercurial remembers your passwords
12 and reuses them without prompting (as if you stored them in ``.hgrc``),
12 and reuses them without prompting (as if you stored them in ``.hgrc``),
13 but password storage is reasonably secure.
13 but password storage is reasonably secure.
14
14
15 Actual password storage is implemented by the keyring_ library, this
15 Actual password storage is implemented by the keyring_ library, this
16 extension glues it to Mercurial.
16 extension glues it to Mercurial.
17
17
18 .. contents::
18 .. contents::
19 :local:
19 :local:
20 :depth: 2
20 :depth: 2
21
21
22 .. sectnum::
22 .. sectnum::
23
23
24 .. _keyring: http://pypi.python.org/pypi/keyring
24 .. _keyring: http://pypi.python.org/pypi/keyring
25 .. _Mercurial: http://mercurial.selenic.com
25 .. _Mercurial: http://mercurial.selenic.com
26
26
27 How does it work
27 How does it work
28 =======================================================
28 =======================================================
29
29
30 On your first pull or push to HTTP url (or first email sent via given
30 On your first pull or push to HTTP url (or first email sent via given
31 SMTP server), you are prompted for the password, just like bare
31 SMTP server), you are prompted for the password, just like bare
32 Mercurial does. But the password you entered is saved to appropriate
32 Mercurial does. But the password you entered is saved to appropriate
33 password database. On successive runs, whenever the password is
33 password database. On successive runs, whenever the password is
34 needed, ``mercurial_keyring`` checks for password in password
34 needed, ``mercurial_keyring`` checks for password in password
35 database, and uses it without troubling you.
35 database, and uses it without troubling you.
36
36
37 In case password turns out to be incorrect (for example, because you
37 In case password turns out to be incorrect (for example, because you
38 changed it, or entered it incorrectly), ``mercurial_keyring`` prompts
38 changed it, or entered it incorrectly), ``mercurial_keyring`` prompts
39 you again, and overwrites the password.
39 you again, and overwrites the password.
40
40
41 You can use many passwords (for various remote urls). Saved passwords
41 You can use many passwords (for various remote urls). Saved passwords
42 are identified by pair of username and url prefix. See below for
42 are identified by pair of username and url prefix. See below for
43 information how to configure those properly.
43 information how to configure those properly.
44
44
45 Installation
45 Installation
46 =======================================================
46 =======================================================
47
47
48 Prerequisites
48 Prerequisites
49 -------------
49 -------------
50
50
51 This extension requires keyring_ and `mercurial_extension_utils`_ to
51 This extension requires keyring_ and `mercurial_extension_utils`_ to
52 work. In many cases both will be installed automatically while you
52 work. In many cases both will be installed automatically while you
53 install ``mercurial_keyring``, but you may need to control the process.
53 install ``mercurial_keyring``, but you may need to control the process.
54
54
55 The keyring_ library can usually be installed by::
55 The keyring_ library can usually be installed by::
56
56
57 pip install --user keyring
57 pip install --user keyring
58
58
59 (or ``easy_install keyring``), but on some systems it is preferable to
59 (or ``easy_install keyring``), but on some systems it is preferable to
60 use official distribution archive. For example, on Debian and Ubuntu,
60 use official distribution archive. For example, on Debian and Ubuntu,
61 you may install ``python-keyring`` and either ``python-keyring-gnome``
61 you may install ``python-keyring`` and either ``python-keyring-gnome``
62 or ``python-keyring-kwallet`` packages::
62 or ``python-keyring-kwallet`` packages::
63
63
64 sudo apt-get install python-keyring python-keyring-gnome
64 sudo apt-get install python-keyring python-keyring-gnome
65
65
66 (this will save you the need to provide working compiler and various
66 (this will save you the need to provide working compiler and various
67 development libraries).
67 development libraries).
68
68
69 The `mercurial_extension_utils`_ module is tiny Python-only module,
69 The `mercurial_extension_utils`_ module is tiny Python-only module,
70 which can be installed by::
70 which can be installed by::
71
71
72 pip install --user mercurial_extension_utils
72 pip install --user mercurial_extension_utils
73
73
74 but in some cases (Windows…) requires more care. See
74 but in some cases (Windows…) requires more care. See
75 `mercurial_extension_utils`_ documentation.
75 `mercurial_extension_utils`_ documentation.
76
76
77
77
78 Extension installation
78 Extension installation
79 ----------------------
79 ----------------------
80
80
81 There are two possible ways of installing the extension: using PyPi package,
81 There are two possible ways of installing the extension: using PyPi package,
82 or using source clone.
82 or using source clone.
83
83
84 To install as a package::
84 To install as a package::
85
85
86 pip install --user mercurial_keyring
86 pip install --user mercurial_keyring
87
87
88 (or ``sudo pip install mercurial_keyring`` for system-wide
88 (or ``sudo pip install mercurial_keyring`` for system-wide
89 installation) and then enable it in ``~/.hgrc`` (or
89 installation) and then enable it in ``~/.hgrc`` (or
90 ``/etc/mercurial/hgrc`` or ``Mercurial.ini``) using::
90 ``/etc/mercurial/hgrc`` or ``Mercurial.ini``) using::
91
91
92 [extensions]
92 [extensions]
93 mercurial_keyring =
93 mercurial_keyring =
94
94
95 To install using source clone, install keyring_ according to the
95 To install using source clone, install keyring_ according to the
96 instructions above, then clone::
96 instructions above, then clone::
97
97
98 hg clone https://bitbucket.org/Mekk/mercurial_keyring/
98 hg clone https://bitbucket.org/Mekk/mercurial_keyring/
99 hg clone https://bitbucket.org/Mekk/mercurial-extension_utils/
99 hg clone https://bitbucket.org/Mekk/mercurial-extension_utils/
100
100
101 and configure Mercurial using full path to the extension module::
101 and configure Mercurial using full path to the extension module::
102
102
103 [extensions]
103 [extensions]
104 mercurial_keyring = /path/to/mercurial_keyring/mercurial_keyring.py
104 mercurial_keyring = /path/to/mercurial_keyring/mercurial_keyring.py
105
105
106 .. _the code:
106 .. _the code:
107 .. _mercurial_keyring.py: http://bitbucket.org/Mekk/mercurial_keyring/src/tip/mercurial_keyring.py
107 .. _mercurial_keyring.py: http://bitbucket.org/Mekk/mercurial_keyring/src/tip/mercurial_keyring.py
108
108
109 Password backend configuration
109 Password backend configuration
110 =======================================================
110 =======================================================
111
111
112 The most appropriate password backend should usually be picked without
112 The most appropriate password backend should usually be picked without
113 configuration (considering installed libraries, operating system,
113 configuration (considering installed libraries, operating system,
114 active desktop session). Still, if necessary, it can be configured
114 active desktop session). Still, if necessary, it can be configured
115 using ``keyringrc.cfg`` file. Refer to keyring_ docs for more
115 using ``keyringrc.cfg`` file. Refer to keyring_ docs for more
116 details.
116 details.
117
117
118 .. note::
118 .. note::
119
119
120 With current (as I write) keyring (5.6), this file is (on Linux)
120 With current (as I write) keyring (5.6), this file is (on Linux)
121 located at ``~/.local/share/python_keyring/keyringrc.cfg`` and
121 located at ``~/.local/share/python_keyring/keyringrc.cfg`` and
122 it's example content looks like::
122 it's example content looks like::
123
123
124 [backend]
124 [backend]
125 default-keyring=keyring.backends.Gnome.Keyring
125 default-keyring=keyring.backends.Gnome.Keyring
126 # default-keyring=keyring.backends.kwallet.Keyring
126 # default-keyring=keyring.backends.kwallet.Keyring
127
127
128 For list of known backends run ``pydoc keyring.backends``.
128 For list of known backends run ``pydoc keyring.backends`` or
129 ``keyring --list-backends`` (which of those commands work,
130 depends on the keyring_ version).
129
131
130
132
131 ``hgrc`` configuration (HTTP)
133 ``hgrc`` configuration (HTTP)
132 =======================================================
134 =======================================================
133
135
134 Mercurial Keyring uses standard Mercurial ``[auth]`` configuration to
136 Mercurial Keyring uses standard Mercurial ``[auth]`` configuration to
135 detect your username (on given remote) and url prefix. You are
137 detect your username (on given remote) and url prefix. You are
136 strongly advised to configure both.
138 strongly advised to configure both.
137
139
138 Without the username ``mercurial_keyring`` can't save or restore
140 Without the username ``mercurial_keyring`` can't save or restore
139 passwords, so it disables itself.
141 passwords, so it disables itself.
140
142
141 Without url prefix ``mercurial_keyring`` works, but binds passwords to
143 Without url prefix ``mercurial_keyring`` works, but binds passwords to
142 repository urls. That means you will have to (re)enter password for
144 repository urls. That means you will have to (re)enter password for
143 every repository cloned from given remote (and that there will be many
145 every repository cloned from given remote (and that there will be many
144 copies of this password in secure storage).
146 copies of this password in secure storage).
145
147
146 Repository level configuration
148 Repository level configuration
147 ------------------------------------
149 ------------------------------------
148
150
149 Edit repository-local ``.hg/hgrc`` and save there the remote
151 Edit repository-local ``.hg/hgrc`` and save there the remote
150 repository path and the username, but do not save the password. For
152 repository path and the username, but do not save the password. For
151 example:
153 example:
152
154
153 ::
155 ::
154
156
155 [paths]
157 [paths]
156 myremote = https://my.server.com/hgrepo/someproject
158 myremote = https://my.server.com/hgrepo/someproject
157
159
158 [auth]
160 [auth]
159 myremote.prefix = https://my.server.com/hgrepo
161 myremote.prefix = https://my.server.com/hgrepo
160 myremote.username = John
162 myremote.username = John
161
163
162 Simpler form with url-embedded name can also be used:
164 Simpler form with url-embedded name can also be used:
163
165
164 ::
166 ::
165
167
166 [paths]
168 [paths]
167 bitbucket = https://John@my.server.com/hgrepo/someproject/
169 bitbucket = https://John@my.server.com/hgrepo/someproject/
168
170
169 but is not recommended.
171 but is not recommended.
170
172
171 Note that all repositories sharing the same ``prefix`` share the same
173 Note that all repositories sharing the same ``prefix`` share the same
172 password.
174 password.
173
175
174 Mercurial allows also for password in ``.hg/hgrc`` (either given by
176 Mercurial allows also for password in ``.hg/hgrc`` (either given by
175 ``Β«prefixΒ».password``, or embedded in url). If such password is found,
177 ``Β«prefixΒ».password``, or embedded in url). If such password is found,
176 Mercurial Keyring disables itself.
178 Mercurial Keyring disables itself.
177
179
178
180
179 Account-level configuration
181 Account-level configuration
180 ---------------------------
182 ---------------------------
181
183
182 If you are consistent about remote repository nicknames, you can
184 If you are consistent about remote repository nicknames, you can
183 configure the username in your `~/.hgrc` (`.hgrc` in your home
185 configure the username in your `~/.hgrc` (`.hgrc` in your home
184 directory). For example, write there::
186 directory). For example, write there::
185
187
186 [auth]
188 [auth]
187 acme.prefix = hg.acme.com/repositories
189 acme.prefix = hg.acme.com/repositories
188 acme.username = johnny
190 acme.username = johnny
189 acme.schemes = http https
191 acme.schemes = http https
190 bitbucket.prefix = https://bitbucket.org
192 bitbucket.prefix = https://bitbucket.org
191 bitbucket.username = Mekk
193 bitbucket.username = Mekk
192 mydep.prefix = https://dev.acmeorg.com
194 mydep.prefix = https://dev.acmeorg.com
193 mydep.username = drmartin
195 mydep.username = drmartin
194
196
195 and as long as you use ``acme`` alias for repositories like
197 and as long as you use ``acme`` alias for repositories like
196 ``https://hg.acme.com/repositories/my_beautiful_app``, username
198 ``https://hg.acme.com/repositories/my_beautiful_app``, username
197 ``johnny`` will be used, and the same password reused. Similarly
199 ``johnny`` will be used, and the same password reused. Similarly
198 any ``hg push bitbucket`` will share the same password.
200 any ``hg push bitbucket`` will share the same password.
199
201
200 With such config repository-level ``.hg/hgrc`` need only contain
202 With such config repository-level ``.hg/hgrc`` need only contain
201 ``[paths]``.
203 ``[paths]``.
202
204
203 Additional advantage of this method is that it works also during
205 Additional advantage of this method is that it works also during
204 `clone`.
206 `clone`.
205
207
206
208
207 .. note::
209 .. note::
208
210
209 Mercurial Keyring works well with `Path Pattern`_. On my setup I use
211 Mercurial Keyring works well with `Path Pattern`_. On my setup I use
210 prefix as above, and::
212 prefix as above, and::
211
213
212 [path_pattern]
214 [path_pattern]
213 bitbucket.local = ~/devel/{below}
215 bitbucket.local = ~/devel/{below}
214 bitbucket.remote = https://bitbucket.org/Mekk/{below:/=-}
216 bitbucket.remote = https://bitbucket.org/Mekk/{below:/=-}
215
217
216 so all my repositories understand ``hg push bitbucket`` without
218 so all my repositories understand ``hg push bitbucket`` without
217 any repository-level configuration.
219 any repository-level configuration.
218
220
219
221
220 ``hgrc`` configuration (SMTP)
222 ``hgrc`` configuration (SMTP)
221 =======================================================
223 =======================================================
222
224
223 Edit either repository-local ``.hg/hgrc``, or ``~/.hgrc`` and set
225 Edit either repository-local ``.hg/hgrc``, or ``~/.hgrc`` and set
224 there all standard email and smtp properties, including SMTP
226 there all standard email and smtp properties, including SMTP
225 username, but without SMTP password. For example:
227 username, but without SMTP password. For example:
226
228
227 ::
229 ::
228
230
229 [email]
231 [email]
230 method = smtp
232 method = smtp
231 from = Joe Doe <Joe.Doe@remote.com>
233 from = Joe Doe <Joe.Doe@remote.com>
232
234
233 [smtp]
235 [smtp]
234 host = smtp.gmail.com
236 host = smtp.gmail.com
235 port = 587
237 port = 587
236 username = JoeDoe@gmail.com
238 username = JoeDoe@gmail.com
237 tls = true
239 tls = true
238
240
239 Just as in case of HTTP, you *must* set username, but *must not* set
241 Just as in case of HTTP, you *must* set username, but *must not* set
240 password here to use the extension, in other cases it will revert to
242 password here to use the extension, in other cases it will revert to
241 the default behavior.
243 the default behavior.
242
244
243 Usage
245 Usage
244 ======================================================
246 ======================================================
245
247
246 Saving and restoring passwords
248 Saving and restoring passwords
247 -------------------------------------------------------
249 -------------------------------------------------------
248
250
249 Configure the repository as above, then just ``hg pull``, ``hg push``,
251 Configure the repository as above, then just ``hg pull``, ``hg push``,
250 etc. You should be asked for the password only once (per every
252 etc. You should be asked for the password only once (per every
251 username and remote repository prefix or url combination).
253 username and remote repository prefix or url combination).
252
254
253 Similarly, for email, configure as above and just ``hg email``.
255 Similarly, for email, configure as above and just ``hg email``.
254 Again, you will be asked for the password once (per every username and
256 Again, you will be asked for the password once (per every username and
255 email server address combination).
257 email server address combination).
256
258
257 Checking password status (``hg keyring_check``)
259 Checking password status (``hg keyring_check``)
258 -------------------------------------------------------
260 -------------------------------------------------------
259
261
260 The ``keyring_check`` command can be used to check whether/which
262 The ``keyring_check`` command can be used to check whether/which
261 password(s) are saved. It can be used in three ways:
263 password(s) are saved. It can be used in three ways:
262
264
263 - without parameters, it prints info related to all HTTP paths
265 - without parameters, it prints info related to all HTTP paths
264 defined for current repository (everything from ``hg paths``
266 defined for current repository (everything from ``hg paths``
265 that resolves to HTTP url)::
267 that resolves to HTTP url)::
266
268
267 hg keyring_check
269 hg keyring_check
268
270
269 - given alias as param, it prints info about this alias::
271 - given alias as param, it prints info about this alias::
270
272
271 hg keyring_check work
273 hg keyring_check work
272
274
273 - finally, any path can be checked::
275 - finally, any path can be checked::
274
276
275 hg keyring_check https://bitbucket.org/Mekk/mercurial_keyring
277 hg keyring_check https://bitbucket.org/Mekk/mercurial_keyring
276
278
277 Deleting saved password (``hg keyring_clear``)
279 Deleting saved password (``hg keyring_clear``)
278 -------------------------------------------------------
280 -------------------------------------------------------
279
281
280 The ``keyring_clear`` command removes saved password related to given
282 The ``keyring_clear`` command removes saved password related to given
281 path. It can be used in two ways:
283 path. It can be used in two ways:
282
284
283 - given alias as param, it drops password used by this alias::
285 - given alias as param, it drops password used by this alias::
284
286
285 hg keyring_clear work
287 hg keyring_clear work
286
288
287 - given full path, it drops password related to this path::
289 - given full path, it drops password related to this path::
288
290
289 hg keyring_clear https://bitbucket.org/Mekk/mercurial_keyring
291 hg keyring_clear https://bitbucket.org/Mekk/mercurial_keyring
290
292
291 Managing passwords using GUI tools
293 Managing passwords using GUI tools
292 ------------------------------------------------------
294 ------------------------------------------------------
293
295
294 Many password backends provide GUI tools for password management,
296 Many password backends provide GUI tools for password management,
295 for example Gnome Keyring passwords can be managed using ``seahorse``,
297 for example Gnome Keyring passwords can be managed using ``seahorse``,
296 and KDE Wallet using ``kwalletmanager``. Those GUI tools can be used
298 and KDE Wallet using ``kwalletmanager``. Those GUI tools can be used
297 to review, edit, or delete saved passwords.
299 to review, edit, or delete saved passwords.
298
300
299 Unfortunately, as I write, keyring_ library does not allow one to
301 Unfortunately, as I write, keyring_ library does not allow one to
300 configure how/where exactly saved passwords are put in the hierarchy,
302 configure how/where exactly saved passwords are put in the hierarchy,
301 and the place is not always intuitive. For example, in KDE Wallet, all
303 and the place is not always intuitive. For example, in KDE Wallet, all
302 passwords saved using ``mercurial_keyring`` show up in the folder
304 passwords saved using ``mercurial_keyring`` show up in the folder
303 named ``Python``.
305 named ``Python``.
304
306
305 .. note::
307 .. note::
306
308
307 This is slightly problematic in case ``mercurial_keyring`` is not
309 This is slightly problematic in case ``mercurial_keyring`` is not
308 the only program using keyring_ library. Passwords saved by another
310 the only program using keyring_ library. Passwords saved by another
309 Python application or script (which also uses keyring_) will be put
311 Python application or script (which also uses keyring_) will be put
310 into the same place, and it may be unclear which password belongs
312 into the same place, and it may be unclear which password belongs
311 to which program. To remedy this, ``mercurial_keyring`` applies
313 to which program. To remedy this, ``mercurial_keyring`` applies
312 slightly unusual labels of the form
314 slightly unusual labels of the form
313 ``Β«usernameΒ»ο»Ώ@@ο»ΏΒ«urlprefixΒ»ο»Ώ@ο»ΏMercurial`` - for example my bitbucket
315 ``Β«usernameΒ»ο»Ώ@@ο»ΏΒ«urlprefixΒ»ο»Ώ@ο»ΏMercurial`` - for example my bitbucket
314 password is labelled ``Mekkο»Ώ@@ο»Ώhttpsο»Ώ://ο»Ώbitbucket.orgο»Ώ@ο»ΏMercurial``.
316 password is labelled ``Mekkο»Ώ@@ο»Ώhttpsο»Ώ://ο»Ώbitbucket.orgο»Ώ@ο»ΏMercurial``.
315
317
316 Implementation details
318 Implementation details
317 =======================================================
319 =======================================================
318
320
319 The extension is monkey-patching the mercurial ``passwordmgr`` class
321 The extension is monkey-patching the mercurial ``passwordmgr`` class
320 to replace the ``find_user_password`` method. Detailed order of operations
322 to replace the ``find_user_password`` method. Detailed order of operations
321 is described in the comments inside `the code`_.
323 is described in the comments inside `the code`_.
322
324
325 Frequent problems
326 =======================================================
327
328 Most problems people face while using ``mercurial_keyring`` are in
329 fact problems with ``keyring`` library and it's backends. In
330 particular, those can manifest by:
331
332 - technical errors mentioning sentences like ``No recommended backend
333 was available. Install the keyrings.alt package…`` (or similar),
334
335 - password prompts on every action (= passwords not being saved).
336
337 Those almost always mean that *natural* keyring backend for given
338 desktop type doesn't work, or is not present at all. For example,
339 some necessary runtime component can be down (say, you use Linux, but
340 have neither Gnome Keyring, nor KDE Wallet, running). Or appropriate
341 backend is not installed because it could not be build during
342 keyring_ library installation (maybe because some required library
343 was not present at the moment of keyring installation, or maybe because compiler
344 as such is not present on the system).
345
346 To diagnose such problems, try using ``keyring`` utility, as described
347 on keyring_ documentation page, for example by::
348
349 keyring --list-backends
350 keyring -b keyrings.alt.Gnome.Keyring set testsvc testuser
351 keyring -b keyrings.alt.Gnome.Keyring get testsvc testuser
352
353 (of course using appropriate backend). If you miss the ``keyring`` command
354 as such, try ``python -m keyring`` instead::
355
356 python -m keyring --list-backends
357 python -m keyring -b keyrings.alt.Gnome.Keyring set testsvc testuser
358 python -m keyring -b keyrings.alt.Gnome.Keyring get testsvc testuser
359
360 If appropriate backend is missing (not listed), or doesn't work
361 (second or third command fails), your keyring is broken. Try looking
362 for further pointers in keyring_ documentation, that project mailing
363 list, or issue tracker. Typically it will turn out, that you need to
364 install some missing tool, or library, and reinstall keyring.
365
366 If ``keyring`` command works, but mercurial with mercurial_keyring does not,
367 try enforcing proper backend (by means of ``keyringrc.cfg``, see above).
368 Only if this doesn't help, there may be a bug in mercurial_keyring.
369
370 .. note::
371
372 By far easiest way to have properly working keyring is to use
373 packaged binary version (like ``python-keyring`` Ubuntu package, or
374 keyring bundled with TortoiseHG on some systems). If you pip-installed
375 keyring and it doesn't work, you may consider ``pip uninstall keyring``
376 and look for binary package instead.
377
378
379
323 History
380 History
324 =======================================================
381 =======================================================
325
382
326 See `HISTORY.txt`_.
383 See `HISTORY.txt`_.
327
384
328 Development
385 Development
329 =======================================================
386 =======================================================
330
387
331 Development is tracked on BitBucket, see
388 Development is tracked on BitBucket, see
332 http://bitbucket.org/Mekk/mercurial_keyring/
389 http://bitbucket.org/Mekk/mercurial_keyring/
333
390
334
391
335 Additional notes
392 Additional notes
336 =======================================================
393 =======================================================
337
394
338 Information about this extension is also available
395 Information about this extension is also available
339 on Mercurial Wiki: http://mercurial.selenic.com/wiki/KeyringExtension
396 on Mercurial Wiki: http://mercurial.selenic.com/wiki/KeyringExtension
340
397
341 Check also `other Mercurial extensions I wrote`_.
398 Check also `other Mercurial extensions I wrote`_.
342
399
343 .. _other Mercurial extensions I wrote: http://mekk.bitbucket.io/mercurial.html
400 .. _other Mercurial extensions I wrote: http://mekk.bitbucket.io/mercurial.html
344
401
345 .. _HISTORY.txt: http://bitbucket.org/Mekk/mercurial_keyring/src/tip/HISTORY.txt
402 .. _HISTORY.txt: http://bitbucket.org/Mekk/mercurial_keyring/src/tip/HISTORY.txt
346 .. _TortoiseHg: http://tortoisehg.bitbucket.org/
403 .. _TortoiseHg: http://tortoisehg.bitbucket.org/
347 .. _Mercurial: http://mercurial.selenic.com
404 .. _Mercurial: http://mercurial.selenic.com
348 .. _mercurial_extension_utils: https://bitbucket.org/Mekk/mercurial-extension_utils/
405 .. _mercurial_extension_utils: https://bitbucket.org/Mekk/mercurial-extension_utils/
349 .. _Path Pattern: https://bitbucket.org/Mekk/mercurial-path_pattern/
406 .. _Path Pattern: https://bitbucket.org/Mekk/mercurial-path_pattern/
General Comments 0
You need to be logged in to leave comments. Login now