contrib/phab-refresh-stack.sh
author Manuel Jacob <me@manueljacob.de>
Mon, 11 Jul 2022 01:51:20 +0200
branchstable
changeset 49378 094a5fa3cf52
parent 48697 fba2d7fab11e
permissions -rwxr-xr-x
procutil: make stream detection in make_line_buffered more correct and strict In make_line_buffered(), we don’t want to wrap the stream if we know that lines get flushed to the underlying raw stream already. Previously, the heuristic was too optimistic. It assumed that any stream which is not an instance of io.BufferedIOBase doesn’t need wrapping. However, there are buffered streams that aren’t instances of io.BufferedIOBase, like Mercurial’s own winstdout. The new logic is different in two ways: First, only for the check, if unwraps any combination of WriteAllWrapper and winstdout. Second, it skips wrapping the stream only if it is an instance of io.RawIOBase (or already wrapped). If it is an instance of io.BufferedIOBase, it gets wrapped. In any other case, the function raises an exception. This ensures that, if an unknown stream is passed or we add another wrapper in the future, we don’t wrap the stream if it’s already line buffered or not wrap the stream if it’s not line buffered. In fact, this was already helpful during development of this change. Without it, I possibly would have forgot that WriteAllWrapper needs to be ignored for the check, leading to unnecessary wrapping if stdout is unbuffered. The alternative would have been to always wrap unknown streams. However, I don’t think that anyone would benefit from being less strict. We can expect streams from the standard library to be subclassing either io.RawIOBase or io.BufferedIOBase, so running Mercurial in the standard way should not regress by this change. Py2exe might replace sys.stdout and sys.stderr, but that currently breaks Mercurial anyway and also these streams don’t claim to be interactive, so this function is not called for them.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
45990
5de27798d2af contrib: add a small script to refresh all diff in the current stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     1
#!/bin/bash
5de27798d2af contrib: add a small script to refresh all diff in the current stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     2
set -eu
5de27798d2af contrib: add a small script to refresh all diff in the current stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     3
48697
fba2d7fab11e phabricator-refresh: add a magic value to skip it in the CI
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46044
diff changeset
     4
if [[ "$PHABRICATOR_TOKEN" == "NO-PHAB" ]]; then
fba2d7fab11e phabricator-refresh: add a magic value to skip it in the CI
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46044
diff changeset
     5
    echo 'Skipping Phabricator Step' >&2
fba2d7fab11e phabricator-refresh: add a magic value to skip it in the CI
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46044
diff changeset
     6
    exit 0
fba2d7fab11e phabricator-refresh: add a magic value to skip it in the CI
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46044
diff changeset
     7
fi
fba2d7fab11e phabricator-refresh: add a magic value to skip it in the CI
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46044
diff changeset
     8
46043
024f90fc01b5 phab-refresh: do not pick draft changeset from the bare "default" branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46016
diff changeset
     9
revision_in_stack=`hg log \
024f90fc01b5 phab-refresh: do not pick draft changeset from the bare "default" branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46016
diff changeset
    10
    --rev '.#stack and ::. and topic()' \
024f90fc01b5 phab-refresh: do not pick draft changeset from the bare "default" branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46016
diff changeset
    11
    -T '\nONE-REV\n' \
024f90fc01b5 phab-refresh: do not pick draft changeset from the bare "default" branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46016
diff changeset
    12
    | grep 'ONE-REV' | wc -l`
024f90fc01b5 phab-refresh: do not pick draft changeset from the bare "default" branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46016
diff changeset
    13
revision_on_phab=`hg log \
024f90fc01b5 phab-refresh: do not pick draft changeset from the bare "default" branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46016
diff changeset
    14
    --rev '.#stack and ::. and topic() and desc("re:\nDifferential Revision: [^\n]+D\d+$")'\
024f90fc01b5 phab-refresh: do not pick draft changeset from the bare "default" branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46016
diff changeset
    15
    -T '\nONE-REV\n' \
024f90fc01b5 phab-refresh: do not pick draft changeset from the bare "default" branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46016
diff changeset
    16
    | grep 'ONE-REV' | wc -l`
45990
5de27798d2af contrib: add a small script to refresh all diff in the current stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    17
5de27798d2af contrib: add a small script to refresh all diff in the current stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    18
if [[ $revision_in_stack -eq 0 ]]; then
5de27798d2af contrib: add a small script to refresh all diff in the current stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    19
    echo "stack is empty" >&2
46016
372409eb5cd1 phab-refresh: do not error out when the stack is empty
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45990
diff changeset
    20
    exit 0
45990
5de27798d2af contrib: add a small script to refresh all diff in the current stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    21
fi
5de27798d2af contrib: add a small script to refresh all diff in the current stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    22
5de27798d2af contrib: add a small script to refresh all diff in the current stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    23
if [[ $revision_on_phab -eq 0 ]]; then
5de27798d2af contrib: add a small script to refresh all diff in the current stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    24
    echo "no tracked diff in this stack" >&2
5de27798d2af contrib: add a small script to refresh all diff in the current stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    25
    exit 0
5de27798d2af contrib: add a small script to refresh all diff in the current stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    26
fi
5de27798d2af contrib: add a small script to refresh all diff in the current stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    27
5de27798d2af contrib: add a small script to refresh all diff in the current stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    28
if [[ $revision_on_phab -lt $revision_in_stack ]]; then
5de27798d2af contrib: add a small script to refresh all diff in the current stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    29
    echo "not all stack changesets (${revision_in_stack}) have matching Phabricator Diff (${revision_on_phab})" >&2
5de27798d2af contrib: add a small script to refresh all diff in the current stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    30
    exit 2
5de27798d2af contrib: add a small script to refresh all diff in the current stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    31
fi
5de27798d2af contrib: add a small script to refresh all diff in the current stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    32
5de27798d2af contrib: add a small script to refresh all diff in the current stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    33
if [[ "$PHABRICATOR_TOKEN" == "" ]]; then
5de27798d2af contrib: add a small script to refresh all diff in the current stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    34
    echo 'missing $PHABRICATOR_TOKEN variable' >&2
48697
fba2d7fab11e phabricator-refresh: add a magic value to skip it in the CI
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46044
diff changeset
    35
    echo '(use PHABRICATOR_TOKEN="NO-PHAB" to disable this step)' >&2
45990
5de27798d2af contrib: add a small script to refresh all diff in the current stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    36
    exit 2
5de27798d2af contrib: add a small script to refresh all diff in the current stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    37
fi
5de27798d2af contrib: add a small script to refresh all diff in the current stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    38
5de27798d2af contrib: add a small script to refresh all diff in the current stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    39
hg \
5de27798d2af contrib: add a small script to refresh all diff in the current stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    40
--config extensions.phabricator= \
5de27798d2af contrib: add a small script to refresh all diff in the current stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    41
--config phabricator.url=https://phab.mercurial-scm.org/ \
5de27798d2af contrib: add a small script to refresh all diff in the current stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    42
--config phabricator.callsign=HG \
5de27798d2af contrib: add a small script to refresh all diff in the current stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    43
--config auth.phabricator.schemes=https \
5de27798d2af contrib: add a small script to refresh all diff in the current stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    44
--config auth.phabricator.prefix=phab.mercurial-scm.org \
5de27798d2af contrib: add a small script to refresh all diff in the current stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    45
--config auth.phabricator.phabtoken=$PHABRICATOR_TOKEN \
46043
024f90fc01b5 phab-refresh: do not pick draft changeset from the bare "default" branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46016
diff changeset
    46
phabsend --rev '.#stack and ::. and topic()' \
46044
9be5db6148fb phab-refresh: allow passing additional argument to the phabsend
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46043
diff changeset
    47
"$@"