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)


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

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

#cleanup ⇒ Object



124
125
126
# File 'lib/renuo/cli/app/release_project.rb', line 124

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

#current_version(project_name) ⇒ Object



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

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

#folder_name(project_name) ⇒ Object



120
121
122
# File 'lib/renuo/cli/app/release_project.rb', line 120

def folder_name(project_name)
  project_name.split('/').last
end

#move_and_cd(project_name) ⇒ Object



116
117
118
# File 'lib/renuo/cli/app/release_project.rb', line 116

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

#release(project_name, update_type, version) ⇒ Object



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

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 with version #{version}."
end

#release_flow(project_name, version) ⇒ Object



89
90
91
92
93
94
95
96
# File 'lib/renuo/cli/app/release_project.rb', line 89

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



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

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

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

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

  return if release_flow(project_name, version)
  abort('>> Unable to finish release and push to master. Cancelling release.')
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



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

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



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

def validate_project_name(project_name)
  abort('>> No project name given.') unless project_name
  unless system("#{MOVE_TO_TEMP} && hub clone #{project_name} && " \
                "cd #{folder_name(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
32
# File 'lib/renuo/cli/app/release_project.rb', line 18

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

  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



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

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)


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

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