Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
pantsbuild.pants / backend / jvm / argfile.py
Size: Mime:
# Copyright 2016 Pants project contributors (see CONTRIBUTORS.md).
# Licensed under the Apache License, Version 2.0 (see LICENSE).

import logging
import os
from contextlib import contextmanager

from pants.util.contextutil import temporary_file
from pants.util.dirutil import safe_open

logger = logging.getLogger(__name__)


@contextmanager
def safe_args(args, options, max_args=None, argfile=None, delimiter="\n", quoter=None, delete=True):
    """Yields args if there are less than a limit otherwise writes args to an argfile and yields an
    argument list with one argument formed from the path of the argfile.

    :param args: The args to work with.
    :param OptionValueContainer options: scoped options object for this task
    :param max_args: The maximum number of args to let though without writing an argfile.  If not
      specified then the maximum will be loaded from the --max-subprocess-args option.
    :param argfile: The file to write args to when there are too many; defaults to a temporary file.
    :param delimiter: The delimiter to insert between args written to the argfile, defaults to '\n'
    :param quoter: A function that can take the argfile path and return a single argument value;
      defaults to: <code>lambda f: '@' + f<code>
    :param delete: If True deletes any arg files created upon exit from this context; defaults to
      True.
    """
    max_args = max_args or options.max_subprocess_args
    if len(args) > max_args:

        def create_argfile(f):
            logger.debug(f"Creating argfile {f.name} with contents {' '.join(args)}")
            f.write(delimiter.join(args))
            f.close()
            return [quoter(f.name) if quoter else f"@{f.name}"]

        if argfile:
            try:
                with safe_open(argfile, "w") as fp:
                    yield create_argfile(fp)
            finally:
                if delete and os.path.exists(argfile):
                    os.unlink(argfile)
        else:
            with temporary_file(cleanup=delete, binary_mode=False) as fp:
                yield create_argfile(fp)
    else:
        yield args