#!/bin/bash

# Copyright 2016 The Bazel Authors. 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.

#
# Use this to create a bug report for IntelliJ plugin bugs.
#
# Usage: create_bugreport.sh
#

# For all jars in specified plugin directory, extracts plugin.xml
# and copies to the specified output directory.
# args:
#   - IJ plugin directory
#   - output directory
attach_plugin_xmls() {
  if [ ! -e $1 ]; then return; fi
  pushd $1 >/dev/null
  jars=(*.jar)
  for jar in ${jars[@]}; do
    plugin=${jar%.jar}
    if [ -e $jar ]; then
      mkdir -p $2
      unzip -p $jar "META-INF/plugin.xml" > "$2/${plugin}.xml"
      [ $? -eq 0 ] || { exit 1; }
    fi
  done
  popd >/dev/null
}

files=""
tmp_dir=$(mktemp -d)
output_name=intellij-bug-report-$USER
tar_dir=$tmp_dir/$output_name
output_file=${output_name}.tar.gz

mkdir -p "$tar_dir"
[ $? -eq 0 ] || { exit 1; }

# Attach process information
process_info_dir=$tar_dir/process_info
mkdir -p $process_info_dir

pids=$(jps | awk '/[0-9]+ (Main)$/ { print $1 }')
ts=$(date +%H%M%S)
if [ -z "$pids" ]; then
  echo "Warn: Could not find any IntelliJ processes."
fi
for pid in $pids
do
  stack_file=$process_info_dir/stack_${pid}_${ts}.txt
  mem_file=$process_info_dir/mem_${pid}_${ts}.txt
  capacity_file=$process_info_dir/capacity_${pid}_${ts}.txt
  cmd_file=$process_info_dir/cmd_${pid}_${ts}.txt
  uptime_file=$process_info_dir/uptime_${pid}_${ts}.txt
  jps -v | grep $pid > $cmd_file
  jstack $pid > $stack_file
  jstat -gc $pid > $mem_file
  jstat -gccapacity $pid > $capacity_file
  ps -p $pid -o etime= > $uptime_file
done

# Copy core dumps
mkdir -p $tar_dir/jvm-dumps
cp -p $HOME/java_error_in_* $tar_dir/jvm-dumps 2>/dev/null

# Copy vmoptions files
mkdir -p $tar_dir
cp -p $HOME/*.vmoptions $tar_dir 2>/dev/null

# Copy details from IJ log directories
dir_names=(
  '.IntelliJIdea*'
  '.IdeaIC*'
  '.AndroidStudio*'
  '.CLion*'
)
# other product codes, to add if we end up supporting them:
# PhpStorm, WebStorm, RubyMine, PyCharm, WebIde, AppCode, DataGrip

pushd $HOME >/dev/null
for log_dirs in ${dir_names[@]}; do
  for log_dir in $log_dirs ; do
    if [ ! -e $log_dir ]; then
      continue
    fi
    product=${log_dir:1}
    mkdir ${tar_dir}/${product}
    pushd ${tar_dir}/${product} >/dev/null

    # Attach user's log directories
    if [ -d ${HOME}/${log_dir}/system/log ]; then
      mkdir -p "system/log"
      cp -r "${HOME}/${log_dir}/system/log" "system"
      [ $? -eq 0 ] || { exit 1; }
    fi

    # Attach product version
    ij_home=$(<"${HOME}/${log_dir}/system/.home")
    cp "${ij_home}/build.txt" "version"

    # Attach plugin.xmls
    attach_plugin_xmls "${HOME}/${log_dir}/system/plugins" "${tar_dir}/${product}/system/plugins"
    attach_plugin_xmls "${HOME}/${log_dir}/config/plugins" "${tar_dir}/${product}/config/plugins"

    # copy vmoptions
    mkdir -p vmoptions/home
    cp -p ${HOME}/${log_dir}/*.vmoptions vmoptions/home 2>/dev/null
    mkdir -p vmoptions/installation
    cp -p ${ij_home}/bin/*.vmoptions vmoptions/installation 2>/dev/null

    popd >/dev/null
  done
done
popd >/dev/null

# Attach user's .blazerc
if [ -f $HOME/.blazerc ]; then
  cp $HOME/.blazerc $tar_dir/.blazerc
fi

pushd $tmp_dir >/dev/null
tar -chzf $output_file $output_name
[ $? -eq 0 ] || { exit 1; }
popd >/dev/null

tar_file=$tmp_dir/$output_file
echo "Bug report produced in: $tar_file"
echo "Path has been copied to clipboard."
echo -n $tar_file | xclip -selection primary
echo -n $tar_file | xclip -selection clipboard

