Class: RBT::Action::ToCurrent

Inherits:
RBT::Action show all
Defined in:
lib/rbt/actions/individual_actions/to_current/to_current.rb

Overview

RBT::Action::ToCurrent

Constant Summary

Constants inherited from LeanPrototype

LeanPrototype::ALL_COLOUR_METHODS, LeanPrototype::ARRAY_KDE_KONSOLE_COLOURS_IN_USE, LeanPrototype::DAY_NAMES, LeanPrototype::NAMESPACE, LeanPrototype::SILENT_REDIRECTION

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from LeanPrototype

#a_or_an?, #abbreviations?, #absolute_path, #action, #add_to_the_commandline_arguments, #all_binaries?, #all_files_from, #all_libraries?, #allowed_cookbook_entries?, #appdir_location_of?, #append_onto_the_internal_hash, #append_what_into, #archive_type_of?, #available_programs?, #be_quiet?, #be_verbose?, #begins_with_a_comment?, #capitalize_first_alphabetical_character, #cd_to_the_log_directory, #cd_to_the_temp_directory, #change_directory, #change_permission, #cheering_person?, #chmod, #chop_off_archive, #clear_commandline_options, #cliner, #coloured_and_padded_e, #coloured_and_padded_esystem, #coloured_esystem, #colourize_directory_for_system_results, #colourize_this_error, #colourize_this_file_path, #colourize_this_warning, #commandline_arguments?, #commandline_arguments_without_hyphens?, #comment, #convert_dd_mm_yyyy_to_its_long_variant, #convert_env_variable, #copy_directory, #copy_files, #cpr, #create_directory, #current_hour?, #dd_mmm_yyy, #debug, #debug?, #directory_expanded_cookbooks?, #disable_colours, #display_md5sum?, #do_not_debug, #does_the_cookbook_include_this_program?, #does_this_expanded_cookbook_file_exist_for_this_program?, #does_this_file_exist?, #does_this_file_exist_and_is_it_a_file?, #e, #eblue, #ecomment, #ecrimson, #edir, #editor?, #efancy, #eimp, #enable_colours, #enable_debug, #ensure_main_encoding_for, #eparse, #esystem, #esystem_gold, #etomato, #ewarn, #exit_program, #expanded_cookbooks_directory_exists?, #extract_this_archive, #extract_to?, #file_compiled_programs?, #file_dirname_retaining_trailing_slash, #file_predefined_installation_instructions?, #file_specification_of_registered_cookbook_entries, #find_cookbook_alias_for, #find_this_yaml_file, #first_argument?, #first_non_hyphen_argument?, #get_all_directories_from, #get_all_files_from, #get_all_programs, #get_date, #get_extended_date, #get_files_and_directories_from, #go_to_base_dir, #home_dir?, #host_system?, #infer_the_namespace, #internal_hash?, #internal_hash_set_commandline_arguments, #is_an_archive?, #is_directory?, #is_file?, #is_github_url?, #is_make_available?, #is_on_gobolinux?, #is_on_windows?, #is_roebe?, #is_superuser?, #is_symlink?, #is_this_a_header?, #is_this_a_library?, #is_this_program_included?, #iso_encoding?, #load_dataset_from_this_expanded_cookbook, #load_yaml, #load_yaml_file_from_the_cookbook_directory_for_this_program, #log_directory?, #main_encoding?, #meson_build_file_exists?, #months?, #move_file, #n_programs_are_available?, #n_programs_available?, #namespace?, #no_directory_exists_at, #no_opn, #no_such_file_exists, #open_in_browser, #open_in_editor, #opncomment, #opne, #opnef, #opnerev, #opnerror, #opnesystem, #opnewarn, #opnfancy, #opnn, #packages_directory?, #path_to_this_expanded_cookbooks_dataset, #pkgconfig_directory?, #populate_the_internal_hash_with_default_values, #predefined_installation_instructions?, #prepend_this_commandline_argument, #program_version_of?, #project_base_directory?, #project_yaml_directory?, #query_path?, #rarrow?, #read_file, #read_file_in_default_encoding, #read_file_with_default_encoding, #readlines, #readlines_with_proper_encoding, #register_sigint, #registered_cookbook_entries?, #remove, #remove_archive_from_the_end, #remove_comments_from_each_line, #remove_directory, #remove_double_slashes, #remove_file, #remove_newlines, #remove_parens, #remove_symlink, #remove_this_commandline_argument, #remove_this_entry_from_the_commandline_arguments, #remove_trailing_ANSII_escape_code, #remove_unnecessary_data_from_url, #rename, #report_pwd, #require_the_rbt_aliases, #reset_the_internal_hash, #return_all_archives_from_this_directory, #return_appdir_prefix, #return_commandline_arguments_with_leading_hyphens, #return_current_hour_minutes_second, #return_date, #return_day_of_the_month_based_on_utc, #return_full_time, #return_hours_minutes_seconds_based_on_utc, #return_location_to_this_programs_yaml_file, #return_month_based_on_this_number, #return_month_based_on_utc, #return_opnn, #return_program_information, #return_program_name_for_gobolinux_systems, #return_pwd, #return_unicode_warning_symbol_or_empty_string, #return_utc, #return_utc_time_in_a_format_similar_to_slackware, #return_weekday_based_on_utc, #return_year_based_on_utc, #rev, #run_simulation=, #run_simulation?, #sdir, #sdir_return_pwd, #set_be_silent, #set_be_verbose, #set_first_commandline_argument, #set_namespace, #set_use_opn, #set_xorg_buffer, #sfancy, #sfile, #silent_redirection?, #silently_create_this_directory_if_it_does_not_yet_exist, #simp, #source_base_directory?, #ssym, #stderr, #store_into_this_directory?, #string_right_arrow?, #swarn, #symlink, #sysbin_directory?, #sysetc_directory?, #sysinclude_directory?, #syslib_directory?, #sysshare_directory?, #system_directory?, #temp_directory?, #to_bool, #to_camelcase, #to_iso_encoding, #to_unicode, #today?, #touch, #try_to_require_beautiful_url, #try_to_require_the_environment_information_gem, #try_to_require_the_extracter_gem, #try_to_require_the_open_gem, #try_to_require_the_xorg_buffer, #try_to_require_wget, #try_to_return_a_special_compile_component, #unicode_cliner, #unicode_middle_cliner, #use_colours=, #use_colours?, #use_opn=, #use_opn?, #utf_encoding?, #verbose_truth, #word_wrap, #write_what_into, #write_what_into_via_unicode, #yes_or_no

Constructor Details

#initialize(program_version = nil, run_already = true) ⇒ ToCurrent

#

initialize

The input to this method should be a String such as “/Programs/Python/3.6.2/”.

#


42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/rbt/actions/individual_actions/to_current/to_current.rb', line 42

def initialize(
    program_version = nil,
    run_already     = true
  )
  reset
  set_symlink_this_program_version(program_version.dup)
  # ======================================================================= #
  # === Handle blocks next
  # ======================================================================= #
  if block_given?
    yielded = yield
    case yielded
    # ===================================================================== #
    # === :do_not_register
    # ===================================================================== #
    when :do_not_register
      @internal_hash[:also_do_register_into_the_yaml_database] = false
    else
      if yielded.is_a? Hash
        # ================================================================= #
        # === :use_this_symlink_program_instance
        # ================================================================= #
        if yielded.has_key? :use_this_symlink_program_instance
          set_symlink_program(
            yielded.delete(:use_this_symlink_program_instance)
          )
        end
      end
    end
  end
  run if run_already
end

Class Method Details

.[](i = ARGV) ⇒ Object

#

RBT::Action::ToCurrent[]

#


312
313
314
# File 'lib/rbt/actions/individual_actions/to_current/to_current.rb', line 312

def self.[](i = ARGV)
  new(i)
end

Instance Method Details

#also_do_register_into_the_yaml_database?Boolean

#

also_do_register_into_the_yaml_database?

#

Returns:

  • (Boolean)


297
298
299
# File 'lib/rbt/actions/individual_actions/to_current/to_current.rb', line 297

def also_do_register_into_the_yaml_database?
  @internal_hash[:also_do_register_into_the_yaml_database]
end
#
#


213
214
215
216
217
218
219
220
# File 'lib/rbt/actions/individual_actions/to_current/to_current.rb', line 213

def considering_deleting_the_current_symlink_if_it_exists
  _ = current_target? # Get the symlink target.
  if File.symlink? _
    orev "There already is a symlink at `#{sfile(_)}#{rev}`. "\
         "It will be removed next."
    delete(_)
  end
end

#current_target?Boolean

#

current_target?

This method will assemble the target residing under the /Programs hierarchy.

#

Returns:

  • (Boolean)


248
249
250
# File 'lib/rbt/actions/individual_actions/to_current/to_current.rb', line 248

def current_target?
  "#{programs_dir?}#{program_name?}/Current"
end
#
#


225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
# File 'lib/rbt/actions/individual_actions/to_current/to_current.rb', line 225

def do_create_the_new_symlink
  # ======================================================================= #
  # Next, create a new symlink.
  # ======================================================================= #
  _ = current_target? # Get the symlink target.
  orev "Creating a new symlink at `#{sfile(_)}#{rev}`."
  new_target = full_program_version_target?
  orev "This symlink will point towards `#{sfile(new_target)}#{rev}`."
  if File.directory? new_target
    symlink(program_version?, _)
    # ===================================================================== #
    # Consider invoking rnsymc as well. 
    # ===================================================================== #
    rnsymc(new_target)
  end
end

#full_program_version_target?Boolean

#

full_program_version_target?

This method is assumed to point to a directory.

#

Returns:

  • (Boolean)


268
269
270
# File 'lib/rbt/actions/individual_actions/to_current/to_current.rb', line 268

def full_program_version_target?
  "#{programs_dir?}#{program_name?.capitalize}/#{program_version?}/"
end

#infer_the_program_versionObject

#

infer_the_program_version

#


255
256
257
258
259
260
261
# File 'lib/rbt/actions/individual_actions/to_current/to_current.rb', line 255

def infer_the_program_version
  _ = Dir[programs_dir?+program_name?+'/*'].select {|entry|
    File.directory? entry
  }.sort.reverse
  version = File.basename(_.first)
  return version
end

#program_name?Boolean

#

program_name?

#

Returns:

  • (Boolean)


206
207
208
# File 'lib/rbt/actions/individual_actions/to_current/to_current.rb', line 206

def program_name?
  @program_name
end

#program_version?Boolean

#

program_version?

#

Returns:

  • (Boolean)


114
115
116
# File 'lib/rbt/actions/individual_actions/to_current/to_current.rb', line 114

def program_version?
  @symlink_this_program_version
end

#resetObject

#

reset (reset tag)

#


78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/rbt/actions/individual_actions/to_current/to_current.rb', line 78

def reset
  super()
  infer_the_namespace
  # ======================================================================= #
  # === :also_do_register_into_the_yaml_database
  # ======================================================================= #
  @internal_hash[:also_do_register_into_the_yaml_database] = true
  # ======================================================================= #
  # === @symlink_program_to_use
  # ======================================================================= #
  @symlink_program_to_use = RBT::SymlinkFromToCurrent.new(nil, :do_not_run_yet)
  set_program_name # Must initialize it at the least once.
end

#rnsymc(i = full_program_version_target? ) ⇒ Object

#

rnsymc

This method delegates towards class RBT::SymlinkFromToCurrent.

The argument to this method will default to a String such as:

/home/Programs/Python/3.8.3/
#


282
283
284
285
286
287
288
289
290
291
292
# File 'lib/rbt/actions/individual_actions/to_current/to_current.rb', line 282

def rnsymc(
    i = full_program_version_target?
  )
  @symlink_program_to_use.set_use_this_program(i)
  if also_do_register_into_the_yaml_database?
    # Pass through in this case.
  else
    @symlink_program_to_use.do_not_register
  end
  @symlink_program_to_use.do_symlink
end

#runObject

#

run (run tag)

#


304
305
306
307
# File 'lib/rbt/actions/individual_actions/to_current/to_current.rb', line 304

def run
  considering_deleting_the_current_symlink_if_it_exists
  do_create_the_new_symlink
end

#set_program_name(i = nil) ⇒ Object

#

set_program_name

The setter of the program name.

#


123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# File 'lib/rbt/actions/individual_actions/to_current/to_current.rb', line 123

def set_program_name(i = nil)
  i = i.first if i.is_a? Array
  if i.nil?
    # ===================================================================== #
    # In this case, we will try to obtain the program name from
    # the target directory.
    # ===================================================================== #
    _ = return_pwd
    if _.include? programs_dir? and
       (_.count('/') > 1)
       i = _
    end
  end
  i = i.to_s.dup
  i = File.basename(i) if i.include? '/'
  i.capitalize!
  @program_name = i
end
#

This method can be used to assign towards the symlink-program that will be used. For example, class RBT::Compile can pass its own modified variant into this method here, thus being able to control what class RBT::ToCurrent is doing at the symlink-progam step.

#


100
101
102
103
104
105
106
107
108
109
# File 'lib/rbt/actions/individual_actions/to_current/to_current.rb', line 100

def set_symlink_program(i)
  # ======================================================================= #
  # We really set to the class that we want to use here, so the
  # next line is correct.
  #
  # We default to class RBT::SymlinkFromToCurrent since as of
  # April 2021.
  # ======================================================================= #
  @symlink_program_to_use = i
end
#

This setter keeps track of the particular program version that we will use. For example, if we have an input such as “/Programs/Python/3.6.2”, then the program_version will be 3.6.2.

#


150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
# File 'lib/rbt/actions/individual_actions/to_current/to_current.rb', line 150

def set_symlink_this_program_version(i)
  i = i.first if i.is_a? Array
  # ======================================================================= #
  # === Safeguard against nil-entries
  # ======================================================================= #
  if i.nil? # fetch random entry
    entries = Dir['*'] # Fetch all entries first.
    if entries.size > 1 # Try to find a number
      i = entries.select {|line| line =~ /\d+/ }.first
    else
      i = entries.first
    end
  end
  # ======================================================================= #
  # === Get rid of trailing '/' tokens.
  # ======================================================================= #
  if i.end_with? '/'
    i = i.dup if i.frozen?
    i.chop!
  end
  # ======================================================================= #
  # === Counter how many '/' are in the given input
  #
  # Example: /home/Programs/Xev/1.2.4
  # ======================================================================= #
  if i.include? programs_dir? and
     (i =~ /\d+/) and
     (i.count('/') > 1) # Has more than one '/' token.
    # ===================================================================== #
    # In this case, we assume that the user has input something
    # such as "/Programs/Python/3.6.2".
    # ===================================================================== #
    splitted = i.split('/').reject(&:empty?)
    # ===================================================================== #
    # Example for splitted:
    #
    #   ["home", "Programs", "Xev", "1.2.4"]
    #
    # ===================================================================== #
    use_this_program_name = splitted[-2]
    set_program_name(use_this_program_name)
    i = splitted[-1]
  end
  unless (i =~ /\d+/)
    # ===================================================================== #
    # Set the name of the program e. g. if we input only "python" here.
    # ===================================================================== #
    set_program_name(i) unless i.include? '/'
    i = infer_the_program_version # Must infer the version in this case.
  end
  @symlink_this_program_version = i
end