## @package diagnose_protobuf
# Module scripts.diagnose_protobuf
"""Diagnoses the current protobuf situation.

Protocol buffer needs to be properly installed for Caffe2 to work, and
sometimes it is rather tricky. Specifically, we will need to have a
consistent version between C++ and python simultaneously. This is a
convenience script for one to quickly check if this is so on one's local
machine.

Usage:
    [set your environmental variables like PATH and PYTHONPATH]
    python scripts/diagnose_protobuf.py
"""

import os
import re
from subprocess import Popen, PIPE

# Get python protobuf version.
try:
    import google.protobuf
    python_version = google.protobuf.__version__
    python_protobuf_installed = True
except ImportError:
    print("DEBUG: cannot find python protobuf install.")
    python_protobuf_installed = False

if os.name == 'nt':
    protoc_name = 'protoc.exe'
else:
    protoc_name = 'protoc'

try:
    p = Popen([protoc_name, '--version'], stdout=PIPE, stderr=PIPE)
    out, err = p.communicate()
except:
    print('DEBUG: did not find protoc binary.')
    print('DEBUG: out: ' + out)
    print('DEBUG: err: ' + err)
    native_protobuf_installed = False
else:
    if p.returncode:
        print('DEBUG: protoc returned a non-zero return code.')
        print('DEBUG: out: ' + out)
        print('DEBUG: err: ' + err)
        native_protobuf_installed = False
    else:
        tmp = re.search(r'\d\.\d\.\d', out)
        if tmp:
            native_version = tmp.group(0)
            native_protobuf_installed = True
        else:
            print('DEBUG: cannot parse protoc version string.')
            print('DEBUG: out: ' + out)
            native_protobuf_installed = False

PYTHON_PROTOBUF_NOT_INSTALLED = """
You have not installed python protobuf. Protobuf is needed to run caffe2. You
can install protobuf via pip or conda (if you are using anaconda python).
"""

NATIVE_PROTOBUF_NOT_INSTALLED = """
You have not installed the protoc binary. Protoc is needed to compile Caffe2
protobuf source files. Depending on the platform you are on, you can install
protobuf via:
    (1) Mac: using homebrew and do brew install protobuf.
    (2) Linux: use apt and do apt-get install libprotobuf-dev
    (3) Windows: install from source, or from the releases here:
        https://github.com/google/protobuf/releases/
"""

VERSION_MISMATCH = """
Your python protobuf is of version {py_ver} but your native protoc version is of
version {native_ver}. This will cause the installation to produce incompatible
protobuf files. This is bad in general - consider installing the same version.
""".format(py_ver=python_version, native_ver=native_version)

# Now, give actual recommendations
if not python_protobuf_installed:
    print(PYTHON_PROTOBUF_NOT_INSTALLED)

if not native_protobuf_installed:
    print(NATIVE_PROTOBUF_NOT_INSTALLED)

if python_protobuf_installed and native_protobuf_installed:
    if python_version != native_version:
        print(VERSION_MISMATCH)
    else:
        print('All looks good.')
