Class: Fastlane::Actions::ResetGitRepoAction

Inherits:
Fastlane::Action show all
Defined in:
lib/fastlane/actions/reset_git_repo.rb

Overview

Does a hard reset and clean on the repo

Class Method Summary collapse

Methods inherited from Fastlane::Action

action_name, authors, output, return_value, sh, step_text

Class Method Details

.authorObject



90
91
92
# File 'lib/fastlane/actions/reset_git_repo.rb', line 90

def self.author
  'lmirosevic'
end

.available_optionsObject



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/fastlane/actions/reset_git_repo.rb', line 56

def self.available_options
  [
    FastlaneCore::ConfigItem.new(key: :files,
                                 env_name: "FL_RESET_GIT_FILES",
                                 description: "Array of files the changes should be discarded. If not given, all files will be discarded",
                                 optional: true,
                                 is_string: false,
                                 verify_block: proc do |value|
                                   UI.user_error!("Please pass an array only") unless value.kind_of? Array
                                 end),
    FastlaneCore::ConfigItem.new(key: :force,
                                 env_name: "FL_RESET_GIT_FORCE",
                                 description: "Skip verifying of previously clean state of repo. Only recommended in combination with `files` option",
                                 is_string: false,
                                 default_value: false),
    FastlaneCore::ConfigItem.new(key: :skip_clean,
                                 env_name: "FL_RESET_GIT_SKIP_CLEAN",
                                 description: "Skip 'git clean' to avoid removing untracked files like `.env`. Defaults to false",
                                 is_string: false,
                                 default_value: false),
    FastlaneCore::ConfigItem.new(key: :disregard_gitignore,
                                 env_name: "FL_RESET_GIT_DISREGARD_GITIGNORE",
                                 description: "Setting this to true will clean the whole repository, ignoring anything in your local .gitignore. Set this to true if you want the equivalent of a fresh clone, and for all untracked and ignore files to also be removed",
                                 is_string: false,
                                 optional: true,
                                 default_value: true),
    FastlaneCore::ConfigItem.new(key: :exclude,
                                 env_name: "FL_RESET_GIT_EXCLUDE",
                                 description: "You can pass a string, or array of, file pattern(s) here which you want to have survive the cleaning process, and remain on disk. E.g. to leave the `artifacts` directory you would specify `exclude: 'artifacts'`. Make sure this pattern is also in your gitignore! See the gitignore documentation for info on patterns",
                                 is_string: false,
                                 optional: true)
  ]
end

.descriptionObject



43
44
45
# File 'lib/fastlane/actions/reset_git_repo.rb', line 43

def self.description
  "Resets git repo to a clean state by discarding uncommited changes"
end

.detailsObject



47
48
49
50
51
52
53
54
# File 'lib/fastlane/actions/reset_git_repo.rb', line 47

def self.details
  [
    "This action will reset your git repo to a clean state, discarding any uncommitted and untracked changes. Useful in case you need to revert the repo back to a clean state, e.g. after the fastlane run.",
    "Untracked files like `.env` will also be deleted, unless `:skip_clean` is true.",
    "It's a pretty drastic action so it comes with a sort of safety latch. It will only proceed with the reset if either of these conditions are met:",
    "You have called the ensure_git_status_clean action prior to calling this action. This ensures that your repo started off in a clean state, so the only things that will get destroyed by this action are files that are created as a byproduct of the fastlane run."
  ].join(' ')
end

.is_supported?(platform) ⇒ Boolean

Returns:

  • (Boolean)


94
95
96
# File 'lib/fastlane/actions/reset_git_repo.rb', line 94

def self.is_supported?(platform)
  true
end

.run(params) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/fastlane/actions/reset_git_repo.rb', line 7

def self.run(params)
  if params[:force] || params[:force] || Actions.lane_context[SharedValues::GIT_REPO_WAS_CLEAN_ON_START]
    paths = params[:files]

    return paths if Helper.is_test?

    if (paths || []).count == 0
      Actions.sh('git reset --hard HEAD')

      clean_options = ['q', 'f', 'd']
      clean_options << 'x' if params[:disregard_gitignore]
      clean_command = 'git clean' + ' -' + clean_options.join

      # we want to make sure that we have an array of patterns, and no nil values
      unless params[:exclude].kind_of?(Enumerable)
        params[:exclude] = [params[:exclude]].compact
      end

      # attach our exclude patterns to the command
      clean_command += ' ' + params[:exclude].map { |exclude| '-e ' + exclude.shellescape }.join(' ') unless params[:exclude].count == 0

      Actions.sh(clean_command) unless params[:skip_clean]

      UI.success('Git repo was reset and cleaned back to a pristine state.')
    else
      paths.each do |path|
        UI.important("Couldn't find file at path '#{path}'") unless File.exist?(path)
        Actions.sh("git checkout -- '#{path}'")
      end
      UI.success("Git cleaned up #{paths.count} files.")
    end
  else
    raise 'This is a destructive and potentially dangerous action. To protect from data loss, please add the `ensure_git_status_clean` action to the beginning of your lane, or if you\'re absolutely sure of what you\'re doing then call this action with the :force option.'.red
  end
end