mirror of
https://git.launchpad.net/ubuntu-dev-tools
synced 2025-03-26 18:31:10 +00:00
* ubuntutools.subprocess:
- New drop-in replacement wrapper module around subprocess that backports the restore_signals kwarg and defaults close_fds=True - Switch everything previously using subprocess to use ubuntutools.subprocess instead (LP: #785854)
This commit is contained in:
commit
19c33e5e32
3
404main
3
404main
@ -24,12 +24,13 @@
|
|||||||
# This script is used to check if a package and all its build
|
# This script is used to check if a package and all its build
|
||||||
# dependencies are in main or not.
|
# dependencies are in main or not.
|
||||||
|
|
||||||
import subprocess
|
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
import apt_pkg
|
import apt_pkg
|
||||||
import apt
|
import apt
|
||||||
|
|
||||||
|
from ubuntutools import subprocess
|
||||||
|
|
||||||
def process_deps(cache, deps):
|
def process_deps(cache, deps):
|
||||||
"""Takes a list of (build) dependencies and processes it."""
|
"""Takes a list of (build) dependencies and processes it."""
|
||||||
|
|
||||||
|
2
ack-sync
2
ack-sync
@ -22,7 +22,6 @@ import getopt
|
|||||||
import lazr.restfulclient
|
import lazr.restfulclient
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import subprocess
|
|
||||||
import sys
|
import sys
|
||||||
import logging
|
import logging
|
||||||
import glob
|
import glob
|
||||||
@ -31,6 +30,7 @@ import fnmatch
|
|||||||
from launchpadlib.launchpad import Launchpad
|
from launchpadlib.launchpad import Launchpad
|
||||||
|
|
||||||
from ubuntutools.config import UDTConfig
|
from ubuntutools.config import UDTConfig
|
||||||
|
from ubuntutools import subprocess
|
||||||
|
|
||||||
COMMAND_LINE_SYNTAX_ERROR = 1
|
COMMAND_LINE_SYNTAX_ERROR = 1
|
||||||
VERSION_DETECTION_FAILED = 2
|
VERSION_DETECTION_FAILED = 2
|
||||||
|
@ -21,7 +21,6 @@
|
|||||||
import optparse
|
import optparse
|
||||||
import os
|
import os
|
||||||
import shutil
|
import shutil
|
||||||
import subprocess
|
|
||||||
import sys
|
import sys
|
||||||
import tempfile
|
import tempfile
|
||||||
|
|
||||||
@ -39,6 +38,7 @@ from ubuntutools.builder import get_builder
|
|||||||
from ubuntutools.misc import system_distribution, vendor_to_distroinfo, \
|
from ubuntutools.misc import system_distribution, vendor_to_distroinfo, \
|
||||||
codename_to_distribution
|
codename_to_distribution
|
||||||
from ubuntutools.question import YesNoQuestion
|
from ubuntutools.question import YesNoQuestion
|
||||||
|
from ubuntutools import subprocess
|
||||||
|
|
||||||
def error(msg):
|
def error(msg):
|
||||||
Logger.error(msg)
|
Logger.error(msg)
|
||||||
|
24
debian/changelog
vendored
24
debian/changelog
vendored
@ -9,6 +9,11 @@ ubuntu-dev-tools (0.126) UNRELEASED; urgency=low
|
|||||||
* backportpackage, doc/backportpackage.1: Accept codenames from any
|
* backportpackage, doc/backportpackage.1: Accept codenames from any
|
||||||
distribution in the parenting chain. Makes it possible to, e.g.,
|
distribution in the parenting chain. Makes it possible to, e.g.,
|
||||||
backport from Debian. (LP: #703099)
|
backport from Debian. (LP: #703099)
|
||||||
|
* ubuntutools.subprocess:
|
||||||
|
- New drop-in replacement wrapper module around subprocess that
|
||||||
|
backports the restore_signals kwarg and defaults close_fds=True
|
||||||
|
- Switch everything previously using subprocess to use
|
||||||
|
ubuntutools.subprocess instead (LP: #785854)
|
||||||
|
|
||||||
-- Evan Broder <evan@ebroder.net> Sat, 11 Jun 2011 05:11:23 -0700
|
-- Evan Broder <evan@ebroder.net> Sat, 11 Jun 2011 05:11:23 -0700
|
||||||
|
|
||||||
@ -46,25 +51,6 @@ ubuntu-dev-tools (0.125ubuntu1) oneiric; urgency=low
|
|||||||
|
|
||||||
-- Didier Roche <didrocks@ubuntu.com> Fri, 24 Jun 2011 11:50:17 +0200
|
-- Didier Roche <didrocks@ubuntu.com> Fri, 24 Jun 2011 11:50:17 +0200
|
||||||
|
|
||||||
ubuntu-dev-tools (0.124) unstable; urgency=low
|
|
||||||
|
|
||||||
[ Benjamin Drung ]
|
|
||||||
* Move add-patch, edit-patch, suspicious-source, what-patch, and wrap-and-sort
|
|
||||||
from ubuntu-dev-tools into devscripts (Closes: #568481).
|
|
||||||
|
|
||||||
[ Daniel Holbach ]
|
|
||||||
* bitesize:
|
|
||||||
- display error message properly (LP: #785973).
|
|
||||||
- error out if bug is already marked as 'bitesize'.
|
|
||||||
- rephrase bug comment and subscribe person who adds the comment.
|
|
||||||
- work-around LP:336866 and LP:254901.
|
|
||||||
|
|
||||||
[ Stefano Rivera ]
|
|
||||||
* mk-sbuild:
|
|
||||||
- maintainer_name isn't mandatory any more (LP: #787051)
|
|
||||||
|
|
||||||
-- Benjamin Drung <bdrung@debian.org> Wed, 25 May 2011 18:27:46 +0200
|
|
||||||
|
|
||||||
ubuntu-dev-tools (0.123) unstable; urgency=low
|
ubuntu-dev-tools (0.123) unstable; urgency=low
|
||||||
|
|
||||||
[ Stefano Rivera ]
|
[ Stefano Rivera ]
|
||||||
|
3
dgetlp
3
dgetlp
@ -32,7 +32,6 @@ import email.feedparser
|
|||||||
import hashlib
|
import hashlib
|
||||||
import optparse
|
import optparse
|
||||||
import os
|
import os
|
||||||
import subprocess
|
|
||||||
import sys
|
import sys
|
||||||
import urllib2
|
import urllib2
|
||||||
|
|
||||||
@ -43,6 +42,8 @@ except ImportError:
|
|||||||
"use this utility.")
|
"use this utility.")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
from ubuntutools import subprocess
|
||||||
|
|
||||||
USAGE = u"""Usage: %prog [-d|(-v|-q)] <Launchpad URL>
|
USAGE = u"""Usage: %prog [-d|(-v|-q)] <Launchpad URL>
|
||||||
|
|
||||||
This scripts simulates «dget»'s behaviour for files hosted at
|
This scripts simulates «dget»'s behaviour for files hosted at
|
||||||
|
@ -25,10 +25,10 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import subprocess
|
|
||||||
import sys
|
import sys
|
||||||
from optparse import OptionParser
|
from optparse import OptionParser
|
||||||
from ubuntutools.lp.lpapicache import PersonTeam
|
from ubuntutools.lp.lpapicache import PersonTeam
|
||||||
|
from ubuntutools import subprocess
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
usage = "Usage: %prog [-d <directory>] -t <team> [-o <operation>]"
|
usage = "Usage: %prog [-d <directory>] -t <team> [-o <operation>]"
|
||||||
|
@ -25,7 +25,6 @@
|
|||||||
from optparse import OptionParser, SUPPRESS_HELP
|
from optparse import OptionParser, SUPPRESS_HELP
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
import subprocess
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import SOAPpy
|
import SOAPpy
|
||||||
@ -37,6 +36,7 @@ except ImportError:
|
|||||||
from launchpadlib.launchpad import Launchpad
|
from launchpadlib.launchpad import Launchpad
|
||||||
|
|
||||||
from ubuntutools.config import UDTConfig
|
from ubuntutools.config import UDTConfig
|
||||||
|
from ubuntutools import subprocess
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
bug_re = re.compile(r"bug=(\d+)")
|
bug_re = re.compile(r"bug=(\d+)")
|
||||||
|
@ -22,13 +22,14 @@
|
|||||||
|
|
||||||
import datetime
|
import datetime
|
||||||
import os
|
import os
|
||||||
import subprocess
|
|
||||||
import sys
|
import sys
|
||||||
import tempfile
|
import tempfile
|
||||||
|
|
||||||
from launchpadlib.launchpad import Launchpad
|
from launchpadlib.launchpad import Launchpad
|
||||||
from launchpadlib.errors import HTTPError
|
from launchpadlib.errors import HTTPError
|
||||||
|
|
||||||
|
from ubuntutools import subprocess
|
||||||
|
|
||||||
def create_release(project, version):
|
def create_release(project, version):
|
||||||
'''Create new release and milestone for LP project.'''
|
'''Create new release and milestone for LP project.'''
|
||||||
|
|
||||||
|
@ -30,13 +30,13 @@
|
|||||||
# that the target distribution is always meant to be Ubuntu Hardy.
|
# that the target distribution is always meant to be Ubuntu Hardy.
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import subprocess
|
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
from devscripts.logger import Logger
|
from devscripts.logger import Logger
|
||||||
|
|
||||||
from ubuntutools.distro_info import DebianDistroInfo
|
from ubuntutools.distro_info import DebianDistroInfo
|
||||||
import ubuntutools.misc
|
import ubuntutools.misc
|
||||||
|
from ubuntutools import subprocess
|
||||||
|
|
||||||
class PbuilderDist:
|
class PbuilderDist:
|
||||||
def __init__(self, builder):
|
def __init__(self, builder):
|
||||||
|
@ -25,7 +25,6 @@ import debian.debian_support
|
|||||||
import optparse
|
import optparse
|
||||||
import os
|
import os
|
||||||
import shutil
|
import shutil
|
||||||
import subprocess
|
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
from devscripts.logger import Logger
|
from devscripts.logger import Logger
|
||||||
@ -38,6 +37,7 @@ from ubuntutools.requestsync.mail import (getDebianSrcPkg
|
|||||||
from ubuntutools.requestsync.lp import getDebianSrcPkg, getUbuntuSrcPkg
|
from ubuntutools.requestsync.lp import getDebianSrcPkg, getUbuntuSrcPkg
|
||||||
from ubuntutools.lp import udtexceptions
|
from ubuntutools.lp import udtexceptions
|
||||||
from ubuntutools.lp.lpapicache import Launchpad
|
from ubuntutools.lp.lpapicache import Launchpad
|
||||||
|
from ubuntutools import subprocess
|
||||||
|
|
||||||
|
|
||||||
class Version(debian.debian_support.Version):
|
class Version(debian.debian_support.Version):
|
||||||
|
@ -21,7 +21,8 @@
|
|||||||
# ##################################################################
|
# ##################################################################
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
import subprocess
|
|
||||||
|
from ubuntutools import subprocess
|
||||||
|
|
||||||
def extract(iso, path):
|
def extract(iso, path):
|
||||||
command = ['isoinfo', '-R', '-i', iso, '-x', path]
|
command = ['isoinfo', '-R', '-i', iso, '-x', path]
|
||||||
|
@ -31,7 +31,6 @@ from __future__ import with_statement
|
|||||||
|
|
||||||
import hashlib
|
import hashlib
|
||||||
import os.path
|
import os.path
|
||||||
import subprocess
|
|
||||||
import urllib2
|
import urllib2
|
||||||
import urlparse
|
import urlparse
|
||||||
import re
|
import re
|
||||||
@ -45,6 +44,7 @@ from devscripts.logger import Logger
|
|||||||
from ubuntutools.config import UDTConfig
|
from ubuntutools.config import UDTConfig
|
||||||
from ubuntutools.lp.lpapicache import (Launchpad, Distribution,
|
from ubuntutools.lp.lpapicache import (Launchpad, Distribution,
|
||||||
SourcePackagePublishingHistory)
|
SourcePackagePublishingHistory)
|
||||||
|
from ubuntutools import subprocess
|
||||||
|
|
||||||
class DownloadError(Exception):
|
class DownloadError(Exception):
|
||||||
"Unable to pull a source package"
|
"Unable to pull a source package"
|
||||||
|
@ -19,9 +19,9 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import subprocess
|
|
||||||
|
|
||||||
from devscripts.logger import Logger
|
from devscripts.logger import Logger
|
||||||
|
from ubuntutools import subprocess
|
||||||
|
|
||||||
def _build_preparation(result_directory):
|
def _build_preparation(result_directory):
|
||||||
"""prepares the builder for building a package"""
|
"""prepares the builder for building a package"""
|
||||||
|
@ -26,11 +26,11 @@
|
|||||||
import locale
|
import locale
|
||||||
import os
|
import os
|
||||||
import os.path
|
import os.path
|
||||||
from subprocess import Popen, PIPE
|
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
from ubuntutools import distro_info
|
from ubuntutools import distro_info
|
||||||
from ubuntutools.lp.udtexceptions import PocketDoesNotExistError
|
from ubuntutools.lp.udtexceptions import PocketDoesNotExistError
|
||||||
|
from ubuntutools.subprocess import Popen, PIPE
|
||||||
|
|
||||||
_system_distribution_chain = []
|
_system_distribution_chain = []
|
||||||
def system_distribution_chain():
|
def system_distribution_chain():
|
||||||
|
@ -24,9 +24,10 @@ import sys
|
|||||||
import urllib2
|
import urllib2
|
||||||
import re
|
import re
|
||||||
import tempfile
|
import tempfile
|
||||||
import subprocess
|
|
||||||
from debian.changelog import Changelog
|
from debian.changelog import Changelog
|
||||||
|
|
||||||
|
from ubuntutools import subprocess
|
||||||
|
|
||||||
def raw_input_exit_on_ctrlc(*args, **kwargs):
|
def raw_input_exit_on_ctrlc(*args, **kwargs):
|
||||||
'''
|
'''
|
||||||
A wrapper around raw_input() to exit with a normalized message on Control-C
|
A wrapper around raw_input() to exit with a normalized message on Control-C
|
||||||
|
@ -22,13 +22,13 @@
|
|||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import subprocess
|
|
||||||
import smtplib
|
import smtplib
|
||||||
import socket
|
import socket
|
||||||
from debian.changelog import Version
|
from debian.changelog import Version
|
||||||
from ubuntutools.archive import rmadison, FakeSPPH
|
from ubuntutools.archive import rmadison, FakeSPPH
|
||||||
from ubuntutools.distro_info import DebianDistroInfo
|
from ubuntutools.distro_info import DebianDistroInfo
|
||||||
from ubuntutools.requestsync.common import raw_input_exit_on_ctrlc
|
from ubuntutools.requestsync.common import raw_input_exit_on_ctrlc
|
||||||
|
from ubuntutools import subprocess
|
||||||
from ubuntutools.lp.udtexceptions import PackageNotFoundException
|
from ubuntutools.lp.udtexceptions import PackageNotFoundException
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
|
@ -16,7 +16,8 @@
|
|||||||
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import subprocess
|
|
||||||
|
from ubuntutools import subprocess
|
||||||
|
|
||||||
class Patch(object):
|
class Patch(object):
|
||||||
def __init__(self, patch_file):
|
def __init__(self, patch_file):
|
||||||
|
@ -19,7 +19,6 @@ import os
|
|||||||
import pwd
|
import pwd
|
||||||
import re
|
import re
|
||||||
import shutil
|
import shutil
|
||||||
import subprocess
|
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
import debian.changelog
|
import debian.changelog
|
||||||
@ -28,6 +27,7 @@ import launchpadlib.launchpad
|
|||||||
|
|
||||||
from devscripts.logger import Logger
|
from devscripts.logger import Logger
|
||||||
|
|
||||||
|
from ubuntutools import subprocess
|
||||||
from ubuntutools.update_maintainer import update_maintainer
|
from ubuntutools.update_maintainer import update_maintainer
|
||||||
from ubuntutools.question import Question, YesNoQuestion, input_number
|
from ubuntutools.question import Question, YesNoQuestion, input_number
|
||||||
|
|
||||||
|
109
ubuntutools/subprocess.py
Normal file
109
ubuntutools/subprocess.py
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
"""Drop-in replacement for subprocess with better defaults
|
||||||
|
|
||||||
|
This is an API-compatible replacement for the built-in subprocess
|
||||||
|
module whose defaults better line up with our tastes.
|
||||||
|
|
||||||
|
In particular, it:
|
||||||
|
- Adds support for the restore_signals flag if subprocess itself
|
||||||
|
doesn't support it
|
||||||
|
- Defaults close_fds to True
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
from __future__ import absolute_import
|
||||||
|
|
||||||
|
import inspect
|
||||||
|
import signal
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
from subprocess import PIPE, STDOUT, CalledProcessError
|
||||||
|
|
||||||
|
__all__ = ['Popen', 'call', 'check_call', 'check_output', 'CalledProcessError', 'PIPE', 'STDOUT']
|
||||||
|
|
||||||
|
|
||||||
|
class Popen(subprocess.Popen):
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
kwargs.setdefault('close_fds', True)
|
||||||
|
|
||||||
|
if 'restore_signals' not in inspect.getargspec(subprocess.Popen.__init__)[0]:
|
||||||
|
given_preexec_fn = kwargs.pop('preexec_fn', None)
|
||||||
|
restore_signals = kwargs.pop('restore_signals', True)
|
||||||
|
def preexec_fn():
|
||||||
|
if restore_signals:
|
||||||
|
for sig in ('SIGPIPE', 'SIGXFZ', 'SIGXFSZ'):
|
||||||
|
if hasattr(signal, sig):
|
||||||
|
signal.signal(getattr(signal, sig),
|
||||||
|
signal.SIG_DFL)
|
||||||
|
|
||||||
|
if given_preexec_fn:
|
||||||
|
given_preexec_fn()
|
||||||
|
kwargs['preexec_fn'] = preexec_fn
|
||||||
|
|
||||||
|
subprocess.Popen.__init__(self, *args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
# call, check_call, and check_output are copied directly from the
|
||||||
|
# subprocess module shipped with Python 2.7.1-5ubuntu2
|
||||||
|
|
||||||
|
|
||||||
|
def call(*popenargs, **kwargs):
|
||||||
|
"""Run command with arguments. Wait for command to complete, then
|
||||||
|
return the returncode attribute.
|
||||||
|
|
||||||
|
The arguments are the same as for the Popen constructor. Example:
|
||||||
|
|
||||||
|
retcode = call(["ls", "-l"])
|
||||||
|
"""
|
||||||
|
return Popen(*popenargs, **kwargs).wait()
|
||||||
|
|
||||||
|
|
||||||
|
def check_call(*popenargs, **kwargs):
|
||||||
|
"""Run command with arguments. Wait for command to complete. If
|
||||||
|
the exit code was zero then return, otherwise raise
|
||||||
|
CalledProcessError. The CalledProcessError object will have the
|
||||||
|
return code in the returncode attribute.
|
||||||
|
|
||||||
|
The arguments are the same as for the Popen constructor. Example:
|
||||||
|
|
||||||
|
check_call(["ls", "-l"])
|
||||||
|
"""
|
||||||
|
retcode = call(*popenargs, **kwargs)
|
||||||
|
if retcode:
|
||||||
|
cmd = kwargs.get("args")
|
||||||
|
if cmd is None:
|
||||||
|
cmd = popenargs[0]
|
||||||
|
raise CalledProcessError(retcode, cmd)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
def check_output(*popenargs, **kwargs):
|
||||||
|
r"""Run command with arguments and return its output as a byte string.
|
||||||
|
|
||||||
|
If the exit code was non-zero it raises a CalledProcessError. The
|
||||||
|
CalledProcessError object will have the return code in the returncode
|
||||||
|
attribute and output in the output attribute.
|
||||||
|
|
||||||
|
The arguments are the same as for the Popen constructor. Example:
|
||||||
|
|
||||||
|
>>> check_output(["ls", "-l", "/dev/null"])
|
||||||
|
'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n'
|
||||||
|
|
||||||
|
The stdout argument is not allowed as it is used internally.
|
||||||
|
To capture standard error in the result, use stderr=STDOUT.
|
||||||
|
|
||||||
|
>>> check_output(["/bin/sh", "-c",
|
||||||
|
... "ls -l non_existent_file ; exit 0"],
|
||||||
|
... stderr=STDOUT)
|
||||||
|
'ls: non_existent_file: No such file or directory\n'
|
||||||
|
"""
|
||||||
|
if 'stdout' in kwargs:
|
||||||
|
raise ValueError('stdout argument not allowed, it will be overridden.')
|
||||||
|
process = Popen(stdout=PIPE, *popenargs, **kwargs)
|
||||||
|
output, unused_err = process.communicate()
|
||||||
|
retcode = process.poll()
|
||||||
|
if retcode:
|
||||||
|
cmd = kwargs.get("args")
|
||||||
|
if cmd is None:
|
||||||
|
cmd = popenargs[0]
|
||||||
|
raise CalledProcessError(retcode, cmd, output=output)
|
||||||
|
return output
|
@ -18,10 +18,10 @@ import fcntl
|
|||||||
import os
|
import os
|
||||||
import select
|
import select
|
||||||
import signal
|
import signal
|
||||||
import subprocess
|
|
||||||
import time
|
import time
|
||||||
|
|
||||||
import setup
|
import setup
|
||||||
|
from ubuntutools import subprocess
|
||||||
from ubuntutools.test import unittest
|
from ubuntutools.test import unittest
|
||||||
|
|
||||||
BLACKLIST = {
|
BLACKLIST = {
|
||||||
|
@ -15,10 +15,10 @@
|
|||||||
# PERFORMANCE OF THIS SOFTWARE.
|
# PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
|
||||||
import re
|
import re
|
||||||
import subprocess
|
|
||||||
|
|
||||||
import setup
|
import setup
|
||||||
from ubuntutools.test import unittest
|
from ubuntutools.test import unittest
|
||||||
|
from ubuntutools import subprocess
|
||||||
|
|
||||||
WHITELIST = [re.compile(': %s$' % x) for x in (
|
WHITELIST = [re.compile(': %s$' % x) for x in (
|
||||||
# Wildcard import:
|
# Wildcard import:
|
||||||
@ -28,6 +28,8 @@ WHITELIST = [re.compile(': %s$' % x) for x in (
|
|||||||
# mox:
|
# mox:
|
||||||
r"Instance of '.+' has no '(WithSideEffects|MultipleTimes|AndReturn)' "
|
r"Instance of '.+' has no '(WithSideEffects|MultipleTimes|AndReturn)' "
|
||||||
r"member",
|
r"member",
|
||||||
|
# pylint doesn't like *args/**kwargs
|
||||||
|
r"Instance of 'Popen' has no '.*' member",
|
||||||
)]
|
)]
|
||||||
|
|
||||||
class PylintTestCase(unittest.TestCase):
|
class PylintTestCase(unittest.TestCase):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user