## @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
"""

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
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('\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.')




