module FalkorLib::GitFlow

Management of [git flow](github.com/nvie/gitflow) operations I’m using everywhere

Public Instance Methods

branches(type = :master, dir = Dir.pwd, _options = {}) click to toggle source

Return the Gitflow branch :master: Master Branch name for production releases :develop:

# File lib/falkorlib/git/flow.rb, line 182
def branches(type = :master, dir = Dir.pwd, _options = {})
  FalkorLib::Git.config("gitflow.branch.#{type}", dir)
  #confs[type.to_sym]
end
command(name, type = 'feature', action = 'start', path = Dir.pwd, optional_args = '') click to toggle source

generic function to run any of the gitflow commands

# File lib/falkorlib/git/flow.rb, line 153
def command(name, type = 'feature', action = 'start', path = Dir.pwd, optional_args = '')
  error "Invalid git-flow type '#{type}'" unless %w(feature release hotfix support).include?(type)
  error "Invalid action '#{action}'" unless %w(start finish).include?(action)
  error "You must provide a name" if name == ''
  error "The name '#{name}' cannot contain spaces" if name =~ /\s+/
  exit_status = 1
  Dir.chdir( FalkorLib::Git.rootdir(path) ) do
    exit_status = run %(
               git flow #{type} #{action} #{optional_args} #{name}
            )
  end
  exit_status
end
finish(type, name, path = Dir.pwd, optional_args = '') click to toggle source

git flow {feature, hotfix, release, support} finish <name>

# File lib/falkorlib/git/flow.rb, line 173
def finish(type, name, path = Dir.pwd, optional_args = '')
  command(name, type, 'finish', path, optional_args)
end
guess_gitflow_config(dir = Dir.pwd, options = {}) click to toggle source
guess_gitflow_config ######

Guess the gitflow configuration

# File lib/falkorlib/git/flow.rb, line 190
def guess_gitflow_config(dir = Dir.pwd, options = {})
  path = normalized_path(dir)
  use_git = FalkorLib::Git.init?(path)
  return {} if (!use_git or !FalkorLib::GitFlow.init?(path))
  rootdir = FalkorLib::Git.rootdir(path)
  local_config = FalkorLib::Config.get(rootdir, :local)
  return local_config[:gitflow] if local_config[:gitflow]
  config = FalkorLib::Config::GitFlow::DEFAULTS.clone
  [ :master, :develop ].each do |br|
    config[:branches][br.to_sym] = FalkorLib::Git.config("gitflow.branch.#{br}", rootdir)
  end
  [ :feature, :release, :hotfix, :support, :versiontag ].each do |p|
    config[:prefix][p.to_sym] = FalkorLib::Git.config("gitflow.prefix.#{p}", rootdir)
  end
  config
end
init(path = Dir.pwd, options = {}) click to toggle source
Initialize a git-flow repository

Supported options: :interactive [boolean] confirm Gitflow branch names :master [string] Branch name for production releases :develop [string] Branch name for development commits

# File lib/falkorlib/git/flow.rb, line 68
def init(path = Dir.pwd, options = {})
  exit_status = FalkorLib::Git.init(path, options)
  unless command?('git-flow')
    # Check (mainly for Linux) if the command is not available under `/usr/lib/git-core`
    git_lib = '/usr/lib/git-core/'
    error "you shall install git-flow: see https://github.com/nvie/gitflow/wiki/Installation" unless File.exist?(File.join(git_lib, 'git-flow'))
  end
  remotes      = FalkorLib::Git.remotes(path)
  git_root_dir = FalkorLib::Git.rootdir( path )
  Dir.chdir( git_root_dir ) do
    unless FalkorLib::Git.commits?( git_root_dir)
      warn "Not yet any commit detected in this repository."
      readme = 'README.md'
      unless File.exist?( readme )
        answer = ask(cyan("=> initialize a commit with an [empty] #{readme} file (Y|n)?"), 'Yes')
        exit 0 if answer =~ /n.*/i
        FileUtils.touch(readme)
      end
      FalkorLib::Git.add(readme, "Initiate the repository with a '#{readme}' file")
    end
    branches = FalkorLib::Git.list_branch(path)
    gitflow_branches = FalkorLib.config.gitflow[:branches].clone
    # correct eventually the considered branch from the options
    gitflow_branches.each do |t, _b|
      gitflow_branches[t] = options[t.to_sym] if options[t.to_sym]
      confs = FalkorLib::Git.config('gitflow*', path, :hash => true)
      gitflow_branches[t] = confs["gitflow.branch.#{t}"] unless confs.empty?
    end
    if options[:interactive]
      gitflow_branches[:master]  = ask("=> branch name for production releases", gitflow_branches[:master])
      gitflow_branches[:develop] = ask("=> branch name for development commits", gitflow_branches[:develop])
    end
    ap gitflow_branches if options[:debug]
    if remotes.include?( 'origin' )
      info "=> configure remote (tracked) branches"
      exit_status = FalkorLib::Git.fetch(path)
      gitflow_branches.each do |_type, branch|
        if branches.include? "remotes/origin/#{branch}"
          exit_status = FalkorLib::Git.grab(branch, path)
        else
          unless branches.include? branch
            info "=> creating the branch '#{branch}'"
            FalkorLib::Git.create_branch( branch, path )
          end
          exit_status = FalkorLib::Git.publish(branch, path )
        end
      end
    else
      gitflow_branches.each do |_type, branch|
        unless branches.include? branch
          info " => creating the branch '#{branch}'"
          exit_status = FalkorLib::Git.create_branch( branch, path )
        end
      end
    end
    #info "initialize git flow configs"
    gitflow_branches.each do |t, branch|
      exit_status = execute "git config gitflow.branch.#{t} #{branch}"
    end
    FalkorLib.config.gitflow[:prefix].each do |t, prefix|
      exit_status = execute "git config gitflow.prefix.#{t} #{prefix}"
    end
    devel_branch = gitflow_branches[:develop]
    #info "checkout to the main development branch '#{devel_branch}'"
    exit_status = run %(
               git checkout #{devel_branch}
            )
    # git config branch.$(git rev-parse --abbrev-ref HEAD).mergeoptions --no-edit for the develop branch
    exit_status = execute "git config branch.#{devel_branch}.mergeoptions --no-edit"
    if branches.include?('master') && !gitflow_branches.values.include?( 'master' )
      warn "Your git-flow confuguration does not hold the 'master' branch any more"
      warn "You probably want to get rid of it asap by running 'git branch -d master'"
    end
    if devel_branch != 'master' &&
       remotes.include?( 'origin' ) &&
       branches.include?( 'remotes/origin/master')
      warn "You might want to change the remote default branch to point to '#{devel_branch}"
      puts "=> On github: Settings > Default Branch > #{devel_branch}"
      puts "=> On the remote bare Git repository: 'git symbolic-ref HEAD refs/head/#{devel_branch}'"
    end
  end
  exit_status
end
init?(dir = Dir.pwd) click to toggle source
init? ######

Check if gitflow has been initialized

# File lib/falkorlib/git/flow.rb, line 57
def init?(dir = Dir.pwd)
  res = FalkorLib::Git.init?(dir)
  res &= !FalkorLib::Git.config('gitflow*', dir).empty? if res
  res
end
start(type, name, path = Dir.pwd, optional_args = '') click to toggle source

git flow {feature, hotfix, release, support} start <name>

# File lib/falkorlib/git/flow.rb, line 168
def start(type, name, path = Dir.pwd, optional_args = '')
  command(name, type, 'start', path, optional_args)
end