HEX
Server: Apache/2.4.65 (Ubuntu)
System: Linux ielts-store-v2 6.8.0-1036-gcp #38~22.04.1-Ubuntu SMP Thu Aug 14 01:19:18 UTC 2025 x86_64
User: root (0)
PHP: 7.2.34-54+ubuntu20.04.1+deb.sury.org+1
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,
Upload Files
File: //snap/google-cloud-cli/current/platform/ext-runtime/go/bin/detect
#!/usr/bin/python
# Copyright 2015 Google Inc. 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.

"""Fingerprinting code for the Go runtime."""

import fnmatch
import os
import re
import sys

# TODO(b/28231839): Import a vendored gae_ext_runtime library until we have a
# better solution.
sys.path.append(os.path.join(
    os.path.dirname(os.path.dirname(os.path.abspath(sys.argv[0]))), 'lib'))

from gae_ext_runtime import comm

def find_go_files(path):
    """Return list of '*.go' files in directory 'path', listed non-recursively.

    Args:
        path: (str) Application path.

    Returns:
        ([str, ...]) List of full pathnames for all '*.go' files under 'path'
        dir.
    """
    go_files = []
    root, _, filenames = next(os.walk(path))
    for filename in fnmatch.filter(filenames, '*.go'):
        go_files.append(os.path.join(root, filename))
    return go_files


def has_main(filename):
  """Check filename for 'package main' and 'func main'.

  Args:
    filename: (str) File name to check.

  Returns:
    (bool) True if main is found in filename.
  """
  with open(filename) as f:
      found_package = False
      found_func = False
      for line in f:
          if re.match('^package main', line):
              found_package = True
          elif re.match('^func main', line):
              found_func = True
          if found_package and found_func:
              return True
  return False


def main(args):
    if len(args) != 2:
        # If we're being called incorrectly, this probably isn't happening
        # from a framework.
        sys.stderr.write('Invalid Usage: %s <source-root-directory>' %
                         sys.argv[0])
        return 1
    path = args[1]

    comm.info('Checking for Go.')

    # Test #1 - are there any '*.go' files at 'path'?
    go_files = find_go_files(path)
    if not go_files:
        return 1

    # Test #2 - check that one of these files has "package main" and "func main".
    main_found = False
    for f in go_files:
        if has_main(f):
            comm.info('Found Go main in %s', f)
            main_found = True
            break
    if not main_found:
        return 1

    # Send the app.yaml contents.
    runtime = 'custom' if comm.get_config().params.custom else 'go'
    comm.send_runtime_params(None, {'runtime': 'go'})

    return 0


if __name__ == '__main__':
    sys.exit(main(sys.argv))