class SemverVersioning

Constants

SEMVER

Public Instance Methods

auto_update_local_semver() click to toggle source

Method invoked to update multiple semvers locally. This will not update single semver. That has to be done manually

# File lib/semantic_versioning.rb, line 166
def auto_update_local_semver
  if(!Dir.exist?(VERSIONING) || File.exist?('.' + SEMVER))
    raise 'Error - local upgrade process only applies to projects with multiple semvers. If you have one semver at root level, please update it manually if needed. Do not invoke auto_update_local_semver task.'
  end
  updated_semver_with_version_state = fetch_updated_semver
  if updated_semver_with_version_state != nil
    update_dependent_semvers PRODUCT, VERSIONING, updated_semver_with_version_state[0], updated_semver_with_version_state[1]
  end

  display_local_changes_to_user
end
auto_update_semver(project_name, semver_location, semver_file, semver_dimension) click to toggle source

Method to be used from the upgrade project, to update single or multiple semvers on team city

# File lib/semantic_versioning.rb, line 155
def auto_update_semver project_name, semver_location, semver_file, semver_dimension
  Dir.chdir project_name if File.basename(Dir.pwd) != project_name
  if(semver_file.nil? || semver_file.strip == '' || semver_file == '.' + SEMVER)
    increment_version '.' + SEMVER, semver_dimension
  else
    increment_version File.join(semver_location, semver_file), semver_dimension
    update_dependent_semvers project_name, semver_location, semver_file, semver_dimension
  end
end
create_semver_project_map(product, semver_location) click to toggle source
# File lib/semantic_versioning.rb, line 187
def create_semver_project_map product, semver_location
  semver_project_map = Hash.new

  rake_list = get_file_list semver_location, SEMVER
  rake_list.each{ |rakefile|
    rake = rakefile.gsub "#{semver_location}/", ''
    project_name = rake.gsub '.' + SEMVER, ''
    semver_project_map[rake] = "#{product}.#{project_name}.csproj"
  }
  semver_project_map
end
display_local_changes_to_user() click to toggle source
# File lib/semantic_versioning.rb, line 11
def display_local_changes_to_user
  git_status = `git status -s`
  if (git_status != nil || git_status != GlobalConstants::EMPTY)
    puts '********** Local semver/s updated. Please commit the change.'
  end
end
fetch_updated_semver() click to toggle source
# File lib/semantic_versioning.rb, line 18
def fetch_updated_semver

  updated_semver = get_update_semver_file_with_versions

  #for local run user did not increment any semver
  if updated_semver[3] == 0
    puts '*********** No semver incremented detected. ***********'
    return nil
  end

  version_remote = updated_semver[1].split('.')
  version_local = updated_semver[2].split('.')

  incremented = is_semver_incremented version_remote, version_local

  [updated_semver[0].gsub("#{VERSIONING}/", ''), incremented]
end
get_branch_name() click to toggle source
# File lib/semantic_versioning.rb, line 96
def get_branch_name
  current_branch = ENV['GIT_BRANCH_NAME']
  if current_branch.nil?
    raise '********GIT_BRANCH_NAME environment variable required for local rake run. Cannot continue with build. Exiting..............********'
  else
    current_branch
  end
end
get_current_version(path, semver) click to toggle source
# File lib/semantic_versioning.rb, line 128
def get_current_version path, semver
  location = File.join path, semver
  content = File.read location
  current_version = get_semver_version content
  current_version
end
get_file_list(path, extension) click to toggle source
# File lib/semantic_versioning.rb, line 263
def get_file_list path, extension
  return Dir.glob("#{path}/*.#{extension}")
end
get_project_dependencies(csproj) click to toggle source

Find a given csproj reference in other projects in the solution

# File lib/semantic_versioning.rb, line 246
def get_project_dependencies csproj
  proj_files = Dir.glob '**/*.csproj'
  @unique_list = Array.new
  proj_files.each{ |file|
    doc = Nokogiri::XML File.read file
    nodes = doc.search 'ProjectReference'
    nodes.each { |node|
      ref_val = node['Include']
      id = ref_val.split('\\')[2]
      if id.eql? csproj
        @unique_list << file.split('/')[2]
      end
    }
  }
  @unique_list.uniq
end
get_project_dependencies_semver_files(projects_dependencies, semver_project_map) click to toggle source

get list of semver files for given project list

# File lib/semantic_versioning.rb, line 233
def get_project_dependencies_semver_files projects_dependencies, semver_project_map
  project_semver_map = semver_project_map.invert
  @values  = Array.new
  projects_dependencies.each { |dependency|
    if semver_project_map.value?(dependency)
      @values << project_semver_map[dependency]
    end
  }
  @values
end
get_remote_name() click to toggle source
# File lib/semantic_versioning.rb, line 105
def get_remote_name
  remote_name = ENV['GIT_REMOTE_NAME']
  if remote_name.nil?
    raise '********GIT_REMOTE_NAME environment variable required for local rake run. Cannot continue with build. Exiting..............********'
  else
    @remote = `git remote -v`.split("\n")
    @remote.each { |val|
      if val =~ /#{remote_name}/
        return val.split(" ")[1].sub('.git', '')
      end
    }
  end
end
get_repo_version(semver) click to toggle source
# File lib/semantic_versioning.rb, line 119
def get_repo_version semver
  remote_name = get_remote_name
  branch_name = get_branch_name
  url = URLTEMPLATE % [remote_name, branch_name, semver]
  page_content = open url
  repo_version = get_semver_version page_content
  repo_version
end
get_semver_version(content) click to toggle source
# File lib/semantic_versioning.rb, line 135
def get_semver_version content
  s = content.split("\n")
  val = ''
  s.each{ |i|
    if i.start_with?(':')
      x = i.split(': ')[1].strip
      x.gsub! "'", ''
      if x.length != 0
        val = val + x.to_s + '.'
      end
    end
  }
  val.chomp '.'
end
get_update_semver_file_with_versions() click to toggle source
# File lib/semantic_versioning.rb, line 36
def get_update_semver_file_with_versions
  count = 0
  semver_file = ''
  version_remote = ''
  version_local = ''

  semvers = get_file_list VERSIONING, SEMVER
  if semvers.empty?
    raise "************Error - no semver files found at #{VERSIONING}********"
  end

  semvers.each { |semver|
    v1 = get_repo_version semver
    v2 = get_current_version VERSIONING, semver.gsub("#{VERSIONING}/", '')
    if (!same_versions v1, v2)
      puts "#{semver} version changed"
      semver_file = semver
      version_remote = v1
      version_local = v2
      count = count + 1
    end
  }
  if count > 1
    raise '*********** Error - Version increment is expected in a single semver file and can be only one of major|minor|patch ************'
    return
  end

  [semver_file, version_remote, version_local, count]
end
increment_version(semver_file, dimension) click to toggle source

Increment the major, minor, or patch of the .semver file.

# File lib/semantic_versioning.rb, line 200
def increment_version semver_file, dimension
  if dimension.nil?
    raise 'The parameter dimension is required to be one of : major | minor | patch'
  end
  semver = load_semver semver_file

  case dimension
  when 'major'
    semver.major += 1
    semver.minor =  0
    semver.patch =  0
  when 'minor'
    semver.minor += 1
    semver.patch =  0
  when 'patch'
    semver.patch += 1
  else
    raise "The parameter #{dimension} is invalid: major | minor | patch"
  end

  hash = "---\n:major: %s\n:minor: %s\n:patch: %s\n:special: '%s'\n:metadata: '%s'"
  value = hash % [semver.major, semver.minor, semver.patch, semver.special, semver.metadata]
  File.write semver_file, value
end
is_semver_incremented(version_remote, version_local) click to toggle source
# File lib/semantic_versioning.rb, line 66
def is_semver_incremented version_remote, version_local
  is_incremented = [version_local[0].to_i - version_remote[0].to_i > 0, version_local[1].to_i - version_remote[1].to_i > 0, version_local[2].to_i - version_remote[2].to_i > 0]

  if is_incremented[0]
    if (version_local[1] != 0 || version_local[2] != 0)
      raise 'Error - major version is incremented. Minor and Patch should be 0. Cannot continue build. Exiting....'
    end
  end

  if is_incremented[1]
    if is_incremented[0]
      raise 'Error - cannot increment both major and minor version. . Exiting....'
    end
  end

  if is_incremented[2]
    if(is_incremented[0] || is_incremented[1])
      raise 'Error - cannot increment major, minor and patch together. . Exiting....'
    end
  end

  if is_incremented[0]
    'major'
  elsif is_incremented[1]
    'minor'
  elsif is_incremented[2]
    'patch'
  end
end
load_semver(path) click to toggle source

load a sepcific semver (rather than generic .semver file

# File lib/semantic_versioning.rb, line 226
def load_semver path
  v = SemVer.new
  v.load path
  v
end
open(url) click to toggle source
# File lib/semantic_versioning.rb, line 7
def open url
  Net::HTTP.get(URI.parse url)
end
same_versions(version1, version2) click to toggle source
# File lib/semantic_versioning.rb, line 150
def same_versions version1, version2
  version1 == version2
end
update_dependent_semvers(product, semver_location, semver_file, dimension) click to toggle source
# File lib/semantic_versioning.rb, line 178
def update_dependent_semvers product, semver_location, semver_file, dimension
  semver_project_map = create_semver_project_map product, semver_location
  projects_dependencies =  get_project_dependencies semver_project_map[semver_file]
  semver_files = get_project_dependencies_semver_files projects_dependencies, semver_project_map
  semver_files.each { |semver|
    increment_version File.join(semver_location, semver), dimension
  }
end