Mercurial > hg
annotate hgext/inotify/__init__.py @ 11638:79231258503b stable
transplant: crash if repo.commit() finds nothing to commit
(makes issue2135, issue2264 more obvious, but does nothing to fix
either one)
This seems to happen in two distinct cases:
* patch.patch() claims success but changes nothing (e.g.
the transplanted changeset adds an empty file that already
exists)
* patch.patch() makes changes, but repo.status() fails to report them
Both of these seem like bugs in other parts of Mercurial, so arguably
it's not transplant's job to detect the failure to commit. However:
* detecting the problem as soon as possible is desirable
* it prevents a more obscure crash later, in transplants.write()
* there might be other lurking (or future) bugs that cause
repo.commit() to do nothing
Also, in the case of issue2264 (source changesets silently dropped by
transplant), the only way to spot the problem currently is the crash
in transplants.write(). Failure to transplant a patch should abort
immediately, whether it's user error (patch does not apply) or a
Mercurial bug (e.g. repo.status() failing to report changes).
author | Greg Ward <greg-hg@gerg.ca> |
---|---|
date | Sun, 18 Jul 2010 21:29:29 -0400 |
parents | 40c06bbf58be |
children | 11aad09a6370 |
rev | line source |
---|---|
6239 | 1 # __init__.py - inotify-based status acceleration for Linux |
2 # | |
3 # Copyright 2006, 2007, 2008 Bryan O'Sullivan <bos@serpentine.com> | |
4 # Copyright 2007, 2008 Brendan Cully <brendan@kublai.com> | |
5 # | |
8225
46293a0c7e9f
updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents:
8206
diff
changeset
|
6 # This software may be used and distributed according to the terms of the |
10263 | 7 # GNU General Public License version 2 or any later version. |
6239 | 8 |
8932
f87884329419
extensions: fix up description lines some more
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8894
diff
changeset
|
9 '''accelerate status report using Linux's inotify service''' |
6239 | 10 |
11 # todo: socket permissions | |
12 | |
7225
59b4ae211584
i18n: import _ instead of gettext
Martin Geisler <mg@daimi.au.dk>
parents:
7219
diff
changeset
|
13 from mercurial.i18n import _ |
8656 | 14 import server |
8552
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
15 from client import client, QueryFailed |
6239 | 16 |
17 def serve(ui, repo, **opts): | |
18 '''start an inotify server for this repository''' | |
9514
7c01599dd340
inotify: use cmdutil.service instead of local daemonizing code
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9355
diff
changeset
|
19 server.start(ui, repo.dirstate, repo.root, opts) |
6239 | 20 |
8555
3e09bc5fee12
inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
21 def debuginotify(ui, repo, **opts): |
3e09bc5fee12
inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
22 '''debugging information for inotify extension |
3e09bc5fee12
inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
23 |
3e09bc5fee12
inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
24 Prints the list of directories being watched by the inotify server. |
3e09bc5fee12
inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
25 ''' |
3e09bc5fee12
inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
26 cli = client(ui, repo) |
3e09bc5fee12
inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
27 response = cli.debugquery() |
3e09bc5fee12
inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
28 |
3e09bc5fee12
inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
29 ui.write(_('directories being watched:\n')) |
3e09bc5fee12
inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
30 for path in response: |
3e09bc5fee12
inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
31 ui.write((' %s/\n') % path) |
3e09bc5fee12
inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
32 |
6239 | 33 def reposetup(ui, repo): |
7522
2f4a399a8787
inotify: do not attempt to monkeypatch bundlerepos
Brendan Cully <brendan@kublai.com>
parents:
7452
diff
changeset
|
34 if not hasattr(repo, 'dirstate'): |
6239 | 35 return |
36 | |
37 class inotifydirstate(repo.dirstate.__class__): | |
38 | |
8556
f5fae700cc00
inotify: set a flag so a failed inotify query doesn't get repeated.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8555
diff
changeset
|
39 # We'll set this to false after an unsuccessful attempt so that |
f5fae700cc00
inotify: set a flag so a failed inotify query doesn't get repeated.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8555
diff
changeset
|
40 # next calls of status() within the same instance don't try again |
f5fae700cc00
inotify: set a flag so a failed inotify query doesn't get repeated.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8555
diff
changeset
|
41 # to start an inotify server if it won't start. |
f5fae700cc00
inotify: set a flag so a failed inotify query doesn't get repeated.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8555
diff
changeset
|
42 _inotifyon = True |
f5fae700cc00
inotify: set a flag so a failed inotify query doesn't get repeated.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8555
diff
changeset
|
43 |
10605
3077ee5ca750
inotify: expose the same dirstate.status() interface as dirstate.
Greg Ward <greg-hg@gerg.ca>
parents:
10493
diff
changeset
|
44 def status(self, match, subrepos, ignored, clean, unknown): |
6603
41eb20cc1c02
match: remove files arg from repo.status and friends
Matt Mackall <mpm@selenic.com>
parents:
6239
diff
changeset
|
45 files = match.files() |
7393
92c952c4470c
inotify: fix status . in repo.root
Brendan Cully <brendan@kublai.com>
parents:
7329
diff
changeset
|
46 if '.' in files: |
7434
cf7741aa1e96
kill some trailing spaces
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7393
diff
changeset
|
47 files = [] |
10176
24ce8f0c0a39
dirstate: don't check state of subrepo directories
Augie Fackler <durin42@gmail.com>
parents:
9855
diff
changeset
|
48 if self._inotifyon and not ignored and not subrepos and not self._dirty: |
8552
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
49 cli = client(ui, repo) |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
50 try: |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8385
diff
changeset
|
51 result = cli.statusquery(files, match, False, |
8552
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
52 clean, unknown) |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
53 except QueryFailed, instr: |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
54 ui.debug(str(instr)) |
8556
f5fae700cc00
inotify: set a flag so a failed inotify query doesn't get repeated.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8555
diff
changeset
|
55 # don't retry within the same hg instance |
f5fae700cc00
inotify: set a flag so a failed inotify query doesn't get repeated.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8555
diff
changeset
|
56 inotifydirstate._inotifyon = False |
8552
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
57 pass |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
58 else: |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
59 if ui.config('inotify', 'debug'): |
7219
1f6d2e487135
inotify: add debugging mode to inotify
Matt Mackall <mpm@selenic.com>
parents:
7218
diff
changeset
|
60 r2 = super(inotifydirstate, self).status( |
10493
283f3b413f19
regression: missing arg from 24ce8f0c0a39 dirstate.{walk,status} changes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10463
diff
changeset
|
61 match, [], False, clean, unknown) |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
62 for c, a, b in zip('LMARDUIC', result, r2): |
7219
1f6d2e487135
inotify: add debugging mode to inotify
Matt Mackall <mpm@selenic.com>
parents:
7218
diff
changeset
|
63 for f in a: |
1f6d2e487135
inotify: add debugging mode to inotify
Matt Mackall <mpm@selenic.com>
parents:
7218
diff
changeset
|
64 if f not in b: |
1f6d2e487135
inotify: add debugging mode to inotify
Matt Mackall <mpm@selenic.com>
parents:
7218
diff
changeset
|
65 ui.warn('*** inotify: %s +%s\n' % (c, f)) |
1f6d2e487135
inotify: add debugging mode to inotify
Matt Mackall <mpm@selenic.com>
parents:
7218
diff
changeset
|
66 for f in b: |
1f6d2e487135
inotify: add debugging mode to inotify
Matt Mackall <mpm@selenic.com>
parents:
7218
diff
changeset
|
67 if f not in a: |
7304
68374f1c8c87
inotify: fix bug in formatting
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7225
diff
changeset
|
68 ui.warn('*** inotify: %s -%s\n' % (c, f)) |
7219
1f6d2e487135
inotify: add debugging mode to inotify
Matt Mackall <mpm@selenic.com>
parents:
7218
diff
changeset
|
69 result = r2 |
8552
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
70 return result |
6239 | 71 return super(inotifydirstate, self).status( |
10176
24ce8f0c0a39
dirstate: don't check state of subrepo directories
Augie Fackler <durin42@gmail.com>
parents:
9855
diff
changeset
|
72 match, subrepos, ignored, clean, unknown) |
6239 | 73 |
74 repo.dirstate.__class__ = inotifydirstate | |
75 | |
76 cmdtable = { | |
8555
3e09bc5fee12
inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
77 'debuginotify': |
3e09bc5fee12
inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
78 (debuginotify, [], ('hg debuginotify')), |
6239 | 79 '^inserve': |
8555
3e09bc5fee12
inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
80 (serve, |
3e09bc5fee12
inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
81 [('d', 'daemon', None, _('run server in background')), |
11321
40c06bbf58be
help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
10605
diff
changeset
|
82 ('', 'daemon-pipefds', '', |
40c06bbf58be
help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
10605
diff
changeset
|
83 _('used internally by daemon mode'), _('NUM')), |
40c06bbf58be
help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
10605
diff
changeset
|
84 ('t', 'idle-timeout', '', |
40c06bbf58be
help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
10605
diff
changeset
|
85 _('minutes to sit idle before exiting'), _('NUM')), |
40c06bbf58be
help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
10605
diff
changeset
|
86 ('', 'pid-file', '', |
40c06bbf58be
help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
10605
diff
changeset
|
87 _('name of file to write process ID to'), _('FILE'))], |
8947
9cda78218ab3
inotify: OPT -> OPTION in cmdline help string
Martin Geisler <mg@lazybytes.net>
parents:
8932
diff
changeset
|
88 _('hg inserve [OPTION]...')), |
6239 | 89 } |