diff --git a/fastlane/actions/increment_version_code.rb b/fastlane/actions/increment_version_code.rb new file mode 100644 index 0000000..c6f0137 --- /dev/null +++ b/fastlane/actions/increment_version_code.rb @@ -0,0 +1,108 @@ +module Fastlane + module Actions + module SharedValues + VERSION_CODE = :VERSION_CODE + end + + class IncrementVersionCodeAction < Action + require 'shellwords' + + def self.run(params) + # Fastlane takes care of reading in the parameter and fetching the environment variable: + UI.message "Using file #{params[:file]} to increment the value of variable named \"#{params[:var_name]}\"" + UI.message "Use specific version code: #{params[:code_num].to_s}" unless !params[:code_num] + + # Define the regular expression to extract and replace the version code variable + re = "^(\\s*(#{params[:var_name]})([^:]*:?\\s+|\\s*=\\s*))([0-9]+)(\\s*((\\/\\/|#).*)?)$" + # Construct the sed command to extract the version code from the targeted file + sed_cmd_print = "#{params[:sed_cmd]} -n -e 's/#{re}/\\4/ p' #{params[:file]}" + + # Extract current version code + code_current = sh(sed_cmd_print, print_command: params[:verbose], print_command_output: params[:verbose]).split("\n").first.strip.to_i + UI.message "Current version code: #{code_current.to_s}" + # Determine the next version code from parameter or by incrementing the current one + code_next = (params[:code_num] ? params[:code_num].to_i : code_current + 1) + # Store the new version code in the targeted file + if Helper.test? + Actions.lane_context[SharedValues::BUILD_NUMBER] = sed_cmd_print + code_new = code_next + else + sed_cmd_replace = "#{params[:sed_cmd]} -i -e 's/#{re}/\\1#{code_next}\\5/' #{params[:file]}" + sh(sed_cmd_replace, print_command: params[:verbose], print_command_output: params[:verbose]) + # Extract the new version code + code_new = sh(sed_cmd_print, print_command: params[:verbose], print_command_output: params[:verbose]).split("\n").first.strip.to_i + end + UI.message "New version code: #{code_new.to_s}" + + Actions.lane_context[SharedValues::VERSION_CODE] = code_new + return code_new + end + + ##################################################### + # @!group Documentation + ##################################################### + + def self.description + "Increment the version code of your Android project" + end + + def self.details + "This action offers for (recent/Gradle) Android projects similar features as increment_build_number does for XCode projects" + end + + def self.available_options + # Define all options this action supports. + [ + FastlaneCore::ConfigItem.new(key: :verbose, + env_name: "FL_INCREMENT_VERSION_CODE_VERBOSE", + description: "optional, set to true to be more verbose", + optional: true, + is_string: false, + default_value: false), + FastlaneCore::ConfigItem.new(key: :sed_cmd, + env_name: "FL_INCREMENT_VERSION_CODE_SED_CMD", + description: "optional, you must specify the sed command with correct switche for extended regexp support", + optional: true, + default_value: "sed -r"), # TODO: adapt for non-GNU version of sed (e.g.: "sed -E" for MacOS) + FastlaneCore::ConfigItem.new(key: :var_name, + env_name: "FL_INCREMENT_VERSION_CODE_VAR_NAME", + description: "optional, you must specify the name of the variable that holds the value to be changed", + optional: true, + default_value: "versionCode"), + FastlaneCore::ConfigItem.new(key: :file, + env_name: "FL_INCREMENT_VERSION_CODE_FILE", + description: "optional, you must specify the path to the config file that holds the value to be changed", + optional: true, + verify_block: proc do |value| + UI.user_error!("Could not find config file") if !File.exist?(value) and !Helper.is_test? + end, + default_value: "app/build.gradle"), + FastlaneCore::ConfigItem.new(key: :code_num, + env_name: "FL_INCREMENT_VERSION_CODE_NUM", + description: "Change to a specific version code number", + optional: true, + is_string: false) + ] + end + + def self.output + # Define the shared values this action provides + [ + ['VERSION_CODE', 'The new version code'] + ] + end + + def self.return_value + "Returns the new version code value" + end + + def self.authors + ["btlogy"] + end + + def self.is_supported?(platform) + [:android].include?(platform) + end + end + end +end