text: # Licensed to the Apache Software Foundation (ASF) under one
  # or more contributor license agreements.  See the NOTICE file
  # distributed with this work for additional information
  # regarding copyright ownership.  The ASF licenses this file
  # to you 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.
  
  """
  This script changes versions in every pom.xml and relevant files.
  
  (How to run)
  python change_version <reef_home> <reef_version_for_pom.xml> -s <true or false>  (optional) -p 
  
  -s option changes value of 'IsSnapshot' in lang/cs/build.props.
  If you use the option "-s false", bulid.props changes as,
   <IsSnapshot>false</IsSnapshot>
   <SnapshotNumber>00</SnapshotNumber>
  
  If you use "-s true", then the value of 'IsSnapshot' is changed to true.
  
  If you use "-p", then only the "pom.xml" files are changed.
  
  You can also see how to run the script with "python change_version.py -h"
  
  (Example)
  python change_version ~/reef 0.14.0 -s true
  python change_version ~/reef 0.14.0 -s false
  python change_version ~/reef 0.14.0 -p -s true
  """
  
  
  import os
  import re
  import sys
  import argparse
  
  """
  Get list of path for every file in a directory
  """
  def get_filepaths(directory):
      file_paths = []
  
      for root, directories, files in os.walk(directory):
          for filename in files:
              filepath = os.path.join(root, filename)
              file_paths.append(filepath)
      return file_paths
  
  """
  Change REEF version to new_version in every pom.xml
  """
  def change_pom(file, new_version):
      changed_str = ""
      ready_to_change = False
  
      f = open(file, 'r')
  
      while True:
          line = f.readline()
          if not line:
              break
          if "<groupId>org.apache.reef</groupId>" in line:
              ready_to_change = True
          if "<version>" in line and ready_to_change:
              break
          changed_str += line
  
      r = re.compile('<version>(.*?)</version>')
      m = r.search(line)
      old_version = m.group(1)
      changed_str += line.replace(old_version, new_version)
  
      while True:
          line = f.readline()
          if not line: 
              break
          changed_str += line
      f.close()
  
      f = open(file, 'w')
      f.write(changed_str)
      f.close()
  
  """
  Change JavaBridgeJarFileName in lang/cs/Org.Apache.REEF.Driver/Constants.cs
  or in lang/cs/Org.Apache.REEF.Driver/DriverConfigGenerator.cs
  """
  def change_constants_cs(file, new_version):
      changed_str = ""
  
      f = open(file, 'r')
      while True:
          line = f.readline()
          if not line:
              break
  
          if "JavaBridgeJarFileName =" in line:
              r = re.compile('"(.*?)"')
              m = r.search(line)
              old_version = m.group(1)
              new_version = "reef-bridge-java-" + new_version + "-shaded.jar"
              changed_str += line.replace(old_version, new_version)
          else:
              changed_str += line
      f.close()
  
      f = open(file, 'w')
      f.write(changed_str)
      f.close()
  
  """
  Change version in every AssemblyInfo.cs and AssemblyInfo.cpp
  """
  def change_assembly_info_cs(file, new_version):
      changed_str = ""
      new_version = new_version.split("-")[0] + ".0"
      
      f = open(file, 'r')
      r = re.compile('"(.*?)"')
  
      while True:
          line = f.readline()
          if not line:
              break
          if ("[assembly: AssemblyVersion(" in line and "*" not in line) or ("[assembly: AssemblyFileVersion(" in line) \
              or ("[assembly:AssemblyVersionAttribute(" in line and "*" not in line) \
              or ("[assembly:AssemblyFileVersion(" in line):
              m = r.search(line)
              old_version = m.group(1)
              changed_str += line.replace(old_version, new_version)
          else:
              changed_str += line
      f.close()
  
      f = open(file, 'w')
      f.write(changed_str)
      f.close()
  
  """
  Read 'IsSnapshot' from lang/cs/build.props
  """
  def read_is_snapshot(file):
      f = open(file, 'r')
      r = re.compile('<IsSnapshot>(.*?)</IsSnapshot>')
      while True:
          line = f.readline()
          if not line:
              break
          if "<IsSnapshot>" in line and "</IsSnapshot>" in line:
              m = r.search(line)
              if(m.group(1)=="true"):
                  return True
              else:
                  return False
      f.close()
  
  """
  Change lang/cs/build.props for the release branch
  """
  def change_build_props(file, is_snapshot):
      changed_str = ""
  
      f = open(file, 'r')
      r1 = re.compile('<IsSnapshot>(.*?)</IsSnapshot>')
      r2 = re.compile('<SnapshotNumber>(.*?)</SnapshotNumber>')
  
      while True:
          line = f.readline()
          if not line:
              break
          if "<IsSnapshot>" in line and "</IsSnapshot>" in line:
              old_is_snapshot = r1.search(line).group(1)
              changed_str += line.replace(old_is_snapshot, is_snapshot)
          elif "<SnapshotNumber>" in line and "</SnapshotNumber>" in line and is_snapshot=="false":
              old_snapshot_number = r2.search(line).group(1)
              changed_str += line.replace(old_snapshot_number, "00")
          else:
              changed_str += line
      f.close()
  
      f = open(file, 'w')
      f.write(changed_str)
      f.close()
  
      print file
  
  """
  Change the name of shaded.jar in run.cmd and lang/cs/Org.Apache.REEF.Client/Properties/Resources.xml
  """
  def change_shaded_jar_name(file, new_version):
      changed_str = ""
  
      f = open(file, 'r')
      r1 = re.compile('reef-bridge-java-(.*?)-shaded.jar')
      r2 = re.compile('reef-bridge-client-(.*?)-shaded.jar')
      while True:
          line = f.readline()
          if not line:
              break
          m1 = r1.search(line)
          m2 = r2.search(line)
          if m1 is not None:
              changed_str += line.replace(m1.group(1), new_version)
          elif m2 is not None:
              changed_str += line.replace(m2.group(1), new_version)
          else:
              changed_str += line
      f.close()
  
      f = open(file, 'w')
      f.write(changed_str)
      f.close()
  
  """
  Change the version in Doxyfile
  """
  def change_project_number_Doxyfile(file, new_version):
      changed_str = ""
  
      f = open(file, 'r')
      while True:
          line = f.readline()
          if not line:
              break
  
          if "PROJECT_NUMBER         = " in line:
              r = re.compile('= (.*?)$')
              m = r.search(line)
              old_version = m.group(1)
              changed_str += line.replace(old_version, new_version)
          else:
              changed_str += line
      f.close()
  
      f = open(file, 'w')
      f.write(changed_str)
      f.close()
  
  
  """
  Change version of every pom.xml, every AssemblyInfo.cs,
  Constants.cs, AssemblyInfo.cpp, run.cmd and Resources.xml
  """
  def change_version(reef_home, new_version, pom_only):
      if pom_only:
          for fi in get_filepaths(reef_home):
              if "pom.xml" in fi:
                  print fi
                  change_pom(fi, new_version)
  
      else:
          for fi in get_filepaths(reef_home):
              if "pom.xml" in fi:
                  print fi
                  change_pom(fi, new_version)
              if "AssemblyInfo.cs" in fi:
                  print fi
                  change_assembly_info_cs(fi, new_version)
  
          change_assembly_info_cs(reef_home + "/lang/cs/Org.Apache.REEF.Bridge/AssemblyInfo.cpp", new_version)
          print reef_home + "/lang/cs/Org.Apache.REEF.Bridge/AssemblyInfo.cpp"
  
          change_assembly_info_cs(reef_home + "/lang/cs/Org.Apache.REEF.ClrDriver/AssemblyInfo.cpp", new_version)
          print reef_home + "/lang/cs/Org.Apache.REEF.ClrDriver/AssemblyInfo.cpp"
  
          change_constants_cs(reef_home + "/lang/cs/Org.Apache.REEF.Driver/Constants.cs", new_version)
          print reef_home + "/lang/cs/Org.Apache.REEF.Driver/Constants.cs"
  
          change_constants_cs(reef_home + "/lang/cs/Org.Apache.REEF.Driver/DriverConfigGenerator.cs", new_version)
          print reef_home + "/lang/cs/Org.Apache.REEF.Driver/DriverConfigGenerator.cs"
  
          change_shaded_jar_name(reef_home + "/lang/cs/Org.Apache.REEF.Client/Properties/Resources.xml", new_version)
          print reef_home + "/lang/cs/Org.Apache.REEF.Client/Properties/Resources.xml"
  
          change_shaded_jar_name(reef_home + "/lang/cs/Org.Apache.REEF.Client/run.cmd", new_version)
          print reef_home + "/lang/cs/Org.Apache.REEF.Client/run.cmd"
  
          change_project_number_Doxyfile(reef_home + "/Doxyfile", new_version)
          print reef_home + "/Doxyfile"
  
  if __name__ == "__main__":
      parser = argparse.ArgumentParser(description="Script for changing version of every pom.xml, " \
          + "every AssemblyInfo.cs, Constants.cs, and AssemblyInfo.cpp")
      parser.add_argument("reef_home", type=str, help="REEF home")
      parser.add_argument("reef_version", type=str, help="REEF version")
      parser.add_argument("-s", "--isSnapshot", type=str, metavar="<true or false>", help="Change 'IsSnapshot' to true or false", required=True)
      parser.add_argument("-p", "--pomonly", help="Change only poms", action="store_true")
      args = parser.parse_args()
      
      reef_home = os.path.abspath(args.reef_home)
      reef_version = args.reef_version
      is_snapshot = args.isSnapshot
      pom_only = args.pomonly
  
      if is_snapshot is not None and not pom_only:
          change_build_props(reef_home + "/lang/cs/build.props", is_snapshot)
  
      if is_snapshot=="true":
          reef_version += "-SNAPSHOT"
  
      change_version(reef_home, reef_version, pom_only)
  
  