Mercurial > hg
annotate hgext/amend.py @ 45095:8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Python 3 offers different kind of streams and it’s not guaranteed for all of
them that calling write() writes all bytes.
When Python is started in unbuffered mode, sys.std{out,err}.buffer are
instances of io.FileIO, whose write() can write less bytes for
platform-specific reasons (e.g. Linux has a 0x7ffff000 bytes maximum and could
write less if interrupted by a signal; when writing to Windows consoles, it’s
limited to 32767 bytes to avoid the "not enough space" error). This can lead to
silent loss of data, both when using sys.std{out,err}.buffer (which may in fact
not be a buffered stream) and when using the text streams sys.std{out,err}
(I’ve created a CPython bug report for that:
https://bugs.python.org/issue41221).
Python may fix the problem at some point. For now, we implement our own wrapper
for procutil.std{out,err} that calls the raw stream’s write() method until all
bytes have been written. We don’t use sys.std{out,err} for larger writes, so I
think it’s not worth the effort to patch them.
author | Manuel Jacob <me@manueljacob.de> |
---|---|
date | Fri, 10 Jul 2020 12:27:58 +0200 |
parents | 687b865b95ad |
children | 6ce89165eaa0 |
rev | line source |
---|---|
33404
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
1 # amend.py - provide the amend command |
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
2 # |
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
3 # Copyright 2017 Facebook, Inc. |
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
4 # |
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
5 # This software may be used and distributed according to the terms of the |
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
6 # GNU General Public License version 2 or any later version. |
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
7 """provide the amend command (EXPERIMENTAL) |
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
8 |
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
9 This extension provides an ``amend`` command that is similar to |
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
10 ``commit --amend`` but does not prompt an editor. |
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
11 """ |
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
12 |
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
13 from __future__ import absolute_import |
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
14 |
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
15 from mercurial.i18n import _ |
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
16 from mercurial import ( |
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
17 cmdutil, |
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
18 commands, |
34970
3e549546a6e9
py3: handle keyword arguments in hgext/amend.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34889
diff
changeset
|
19 pycompat, |
33404
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
20 registrar, |
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
21 ) |
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
22 |
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
23 # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for |
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
24 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should |
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
25 # be specifying the version(s) of Mercurial they are tested with, or |
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
26 # leave the attribute unspecified. |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
27 testedwith = b'ships-with-hg-core' |
33404
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
28 |
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
29 cmdtable = {} |
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
30 command = registrar.command(cmdtable) |
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
31 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42935
diff
changeset
|
32 |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42935
diff
changeset
|
33 @command( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
34 b'amend', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42935
diff
changeset
|
35 [ |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42935
diff
changeset
|
36 ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
37 b'A', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
38 b'addremove', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42935
diff
changeset
|
39 None, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
40 _(b'mark new/missing files as added/removed before committing'), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42935
diff
changeset
|
41 ), |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
42 (b'e', b'edit', None, _(b'invoke editor on commit messages')), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
43 (b'i', b'interactive', None, _(b'use interactive mode')), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42935
diff
changeset
|
44 ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42935
diff
changeset
|
45 b'', |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42935
diff
changeset
|
46 b'close-branch', |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42935
diff
changeset
|
47 None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42935
diff
changeset
|
48 _(b'mark a branch as closed, hiding it from the branch list'), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42935
diff
changeset
|
49 ), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42935
diff
changeset
|
50 (b's', b'secret', None, _(b'use the secret phase for committing')), |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
51 (b'n', b'note', b'', _(b'store a note on the amend')), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42935
diff
changeset
|
52 ] |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42935
diff
changeset
|
53 + cmdutil.walkopts |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42935
diff
changeset
|
54 + cmdutil.commitopts |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42935
diff
changeset
|
55 + cmdutil.commitopts2 |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42935
diff
changeset
|
56 + cmdutil.commitopts3, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
57 _(b'[OPTION]... [FILE]...'), |
40293
c303d65d2e34
help: assigning categories to existing commands
rdamazio@google.com
parents:
34970
diff
changeset
|
58 helpcategory=command.CATEGORY_COMMITTING, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42935
diff
changeset
|
59 inferrepo=True, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42935
diff
changeset
|
60 ) |
33404
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
61 def amend(ui, repo, *pats, **opts): |
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
62 """amend the working copy parent with all or specified outstanding changes |
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
63 |
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
64 Similar to :hg:`commit --amend`, but reuse the commit message without |
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
65 invoking editor, unless ``--edit`` was set. |
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
66 |
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
67 See :hg:`help commit` for more details. |
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
68 """ |
34970
3e549546a6e9
py3: handle keyword arguments in hgext/amend.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34889
diff
changeset
|
69 opts = pycompat.byteskwargs(opts) |
42933
7e9997041781
amend: prevent '\n' in the note string
Matt Harbison <matt_harbison@yahoo.com>
parents:
42932
diff
changeset
|
70 cmdutil.checknotesize(ui, opts) |
7e9997041781
amend: prevent '\n' in the note string
Matt Harbison <matt_harbison@yahoo.com>
parents:
42932
diff
changeset
|
71 |
33404
0d5afd360e9e
amend: new extension providing the amend command
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
72 with repo.wlock(), repo.lock(): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
73 if not opts.get(b'logfile'): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
74 opts[b'message'] = opts.get(b'message') or repo[b'.'].description() |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
75 opts[b'amend'] = True |
34970
3e549546a6e9
py3: handle keyword arguments in hgext/amend.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34889
diff
changeset
|
76 return commands._docommit(ui, repo, *pats, **pycompat.strkwargs(opts)) |