Class: ReleaseProject

Inherits:
Object
  • Object
show all
Defined in:
lib/renuo/cli/app/release_project.rb

Constant Summary collapse

UPDATE_TYPES =
%w[major minor patch custom].freeze
TEMP_FOLDER_NAME =
('_RENUO_RELEASE_TEMP_' + rand(100_000_000).to_s).freeze
MOVE_TO_TEMP =
"mkdir -p #{TEMP_FOLDER_NAME} && cd #{TEMP_FOLDER_NAME}".freeze

Instance Method Summary collapse

Instance Method Details

#checkout?(project_name) ⇒ Boolean

Returns:

  • (Boolean)


70
71
72
73
74
# File 'lib/renuo/cli/app/release_project.rb', line 70

def checkout?(project_name)
  system("#{move_and_cd(project_name)} && " \
         'git checkout master && git pull origin master && ' \
         'git checkout develop && git pull origin develop')
end

#cleanupObject



113
114
115
# File 'lib/renuo/cli/app/release_project.rb', line 113

def cleanup
  system("rm -rf #{TEMP_FOLDER_NAME}")
end

#current_version(project_name) ⇒ Object



91
92
93
94
95
96
97
98
99
# File 'lib/renuo/cli/app/release_project.rb', line 91

def current_version(project_name)
  describe = "#{move_and_cd(project_name)} && git describe --tags"
  tag = '`git rev-list --tags --max-count=1`'
  if `#{move_and_cd(project_name)} && git tag` == ''
    '0.0.0'
  else
    `#{describe} #{tag}`.strip
  end
end

#move_and_cd(project_name) ⇒ Object



109
110
111
# File 'lib/renuo/cli/app/release_project.rb', line 109

def move_and_cd(project_name)
  "#{MOVE_TO_TEMP} && cd #{project_name}"
end

#release(project_name, update_type, version) ⇒ Object



49
50
51
52
53
54
55
# File 'lib/renuo/cli/app/release_project.rb', line 49

def release(project_name, update_type, version)
  version ||= update_version_number(current_version(project_name), update_type)

  release_start project_name, update_type, version

  say '>> Project successfully released.'
end

#release_flow(project_name, version) ⇒ Object



82
83
84
85
86
87
88
89
# File 'lib/renuo/cli/app/release_project.rb', line 82

def release_flow(project_name, version)
  system("#{move_and_cd(project_name)} &&" \
         "git flow release start #{version} && " \
         "GIT_MERGE_AUTOEDIT=no git flow release finish -m #{version} #{version} && " \
         'git checkout master && git push origin master && ' \
         'git checkout develop && git push origin develop && ' \
         'git push --tags')
end

#release_start(project_name, update_type, version) ⇒ Object



57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/renuo/cli/app/release_project.rb', line 57

def release_start(project_name, update_type, version)
  abort('>> Unable to pull from Github. Cancelling release.') unless checkout? project_name

  abort('>> Please bump the version in files manually. Cancelling release.') if
    update_type != UPDATE_TYPES[3] && !version_bump?(project_name, current_version(project_name))

  abort('>> Cancelling Release.') unless
    agree(">> Are you sure you wish to deploy '#{project_name}' " \
          "as a #{update_type} release (#{current_version(project_name)} => #{version})?")
  abort('>> Unable to finish release and push to master. Cancelling release.') unless
    release_flow project_name, version
end

#run(args) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
# File 'lib/renuo/cli/app/release_project.rb', line 6

def run(args)
  project_name, @update_type, @version = args

  validate_update_type(@update_type, @version)
  @version = validate_version(@version)
  validate_project_name(project_name)

  release(project_name, @update_type, @version)
ensure
  cleanup
end

#update_version_number(version, update_type) ⇒ Object



101
102
103
104
105
106
107
# File 'lib/renuo/cli/app/release_project.rb', line 101

def update_version_number(version, update_type)
  version = version.split('.').map(&:to_i)
  type_index = UPDATE_TYPES.index(update_type)
  version[type_index + 1..-1] = [0] * (2 - type_index)
  version[type_index] += 1
  version.join('.')
end

#validate_project_name(project_name) ⇒ Object



40
41
42
43
44
45
46
47
# File 'lib/renuo/cli/app/release_project.rb', line 40

def validate_project_name(project_name)
  abort('>> No project name given.') unless project_name
  unless system("#{MOVE_TO_TEMP} && hub clone #{project_name} && " \
                "cd #{project_name} && git checkout master && git flow init -d")
    cleanup
    abort('>> Project not found on Github.')
  end
end

#validate_update_type(update_type, version) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/renuo/cli/app/release_project.rb', line 18

def validate_update_type(update_type, version)
  say('>> Do not specify a version for a non-custom release. Given version will be ignored.') if
    version && update_type != UPDATE_TYPES[3]

  if !version && update_type == UPDATE_TYPES[3]
    @version = ask('>> Please enter your desired version for your custom release (X.Y.Z):')
    validate_update_type(@update_type, @version)
  end

  return if UPDATE_TYPES.include? update_type

  @update_type = ask('>> Please enter your desired update type (major minor patch custom):')
  validate_update_type(@update_type, version)
end

#validate_version(version) ⇒ Object



33
34
35
36
37
38
# File 'lib/renuo/cli/app/release_project.rb', line 33

def validate_version(version)
  return nil if version.nil?
  version = version.match(/\d+\.\d+\.\d+/)
  return version if version
  abort('>> Invalid Version Number. Use format X.Y.Z for your version.')
end

#version_bump?(project_name, current_version) ⇒ Boolean

Returns:

  • (Boolean)


76
77
78
79
80
# File 'lib/renuo/cli/app/release_project.rb', line 76

def version_bump?(project_name, current_version)
  return true unless
    system("#{move_and_cd(project_name)} &&  grep -R --color --exclude-dir=.git '#{current_version}' .")
  agree('>> Current version number found in above files! Do you wish to continue without changing it?')
end