# -*- coding: utf-8 -*- #
# Copyright 2017 Google LLC. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Extra help for .gcloudignore."""


from googlecloudsdk.calliope import base


@base.UniverseCompatible
class GcloudignoreHelp(base.TopicCommand):
  r"""Reference for `.gcloudignore` files.

  Several commands in `gcloud` involve uploading the contents of a directory to
  Google Cloud to host or build. In many cases, you will not want to
  upload certain files (i.e., "ignore" them).

  If there is a file called `.gcloudignore` _within the top-level directory
  being uploaded_, the files that it specifies (see "SYNTAX") will be ignored.

  Gcloud commands may generate a .gcloudignore file; see the individual
  command help page for details.

  The following `gcloud` commands respect the `.gcloudignore` file:

  * `gcloud app deploy`
  * `gcloud alpha app migrate-to-run`
  * `gcloud beta app migrate-to-run`
    * Note: If you add `app.yaml` to the `.gcloudignore` file, the above
      commands will fail.
  * `gcloud functions deploy`
  * `gcloud builds submit`
  * `gcloud composer environments storage {dags, data, plugins} import`
  * `gcloud container builds submit`
  * `gcloud run deploy`
  * `gcloud run jobs deploy`
  * `gcloud run worker-pools deploy`
  * `gcloud alpha deploy releases create`
  * `gcloud beta deploy releases create`
  * `gcloud deploy releases create`
  * `gcloud infra-manager deployments apply`
  * `gcloud infra-manager previews create`
  * `gcloud alpha functions local deploy`
  * `gcloud alpha run jobs deploy`
  * `gcloud beta run jobs deploy`
  * `gcloud alpha run worker-pools deploy`
  * `gcloud beta run worker-pools deploy`
  * `gcloud alpha run instances dev sync`
  * `gcloud beta run instances dev sync`


  To globally disable `.gcloudignore` parsing (including default file-ignore
  behavior), run:

     $ gcloud config set gcloudignore/enabled false

  The default content of the generated `.gcloudignore` file, which can be
  overridden with `--ignore-file`, is as follows:

    .gcloudignore
    .git
    .gitignore

  ## SYNTAX

  The syntax of `.gcloudignore` borrows heavily from that of `.gitignore`; see
  https://git-scm.com/docs/gitignore or `man gitignore` for a full reference.

  Each line in a `.gcloudignore` is one of the following:

  * *pattern*: a pattern specifies file names to ignore (or explicitly include)
    in the upload. If multiple patterns match the file name, the last matching
    pattern takes precedence.
  * *comment*: comments begin with `#` and are ignored (see "ADVANCED TOPICS"
    for an exception). If you want to include a `#` at the beginning of a
    pattern, you must escape it: ```\#```.
  * *blank line*: A blank line is ignored and useful for readability.

  Some example patterns follow; see the full reference
  (https://git-scm.com/docs/gitignore or `man gitignore`) for details.

  To ignore any file named `foo`, and any file in the root of the upload
  directory named `bar`:

    foo
    /bar

  To ignore any file starting with `foo`, ending with `bar`, or starting with
  `baz` and ending with `qux`:

    foo*
    *bar
    baz*qux

  To explicitly include any file named `foo` (useful if `foo` was excluded
  earlier in the file) and ignore a file named `!bar`:

    !foo
    \!bar

  To ignore any directory `foo` and all its contents (though not a file
  `foo`), any file `baz`, and the directory `qux` and all its contents:

    foo/
    **/baz
    qux/**


  ### ADVANCED TOPICS

  In order to ignore files specified in the gitignore file, there is a special
  comment syntax:

    #!include:.gitignore

  This will insert the content of a `.gitignore`-style file named `.gitignore`
  at the point of the include line. It does not recurse (that is, the included
  file *cannot* `#!include` another file) and cannot be anywhere but the
  top-level directory to be uploaded.

  To display files that will be uploaded run:

    gcloud meta list-files-for-upload

  ## EXAMPLES

  This `.gcloudignore` would prevent the upload of the `node_modules/` directory
  and any files ending in `~`:

    /node_modules/
    *~

  This `.gcloudignore` (similar to the one generated when Git files are
  present) would prevent the upload of the `.gcloudignore` file, the `.git`
  directory, and any files in ignored in the `.gitignore` file:

    .gcloudignore
    # If you would like to upload your .git directory, .gitignore file or
    # files from your .gitignore file, remove the corresponding line below:
    .git
    .gitignore
    #!include:.gitignore
  """
