Class: RBT::Installer::Shell

Inherits:
Base show all
Defined in:
lib/rbt/shell/menu.rb,
lib/rbt/shell/help.rb,
lib/rbt/shell/shell.rb,
lib/rbt/shell/constants.rb

Overview

RBT::Installer::Shell

Constant Summary collapse

DEFAULT_SHOW_N_PROGRAMS_THAT_WERE_LAST_UPDATED =
#

DEFAULT_SHOW_N_PROGRAMS_THAT_WERE_LAST_UPDATED

#
30

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 Base

#cat, #cd_back_to_the_current_working_directory, #consider_reporting_how_many_programs_are_registered, #cookbook_files?, #copy_recursively, #delete_code_of_conduct?, #determine_appdir_prefix_from_this_input, #directory_validation?, #do_not_show_names, #fast_return_file_size_of_this_program, #file_last_symlinked_program?, #file_programs_version_url, #gem_version, #is_a_64bit_system?, #is_ccache_available?, #is_porg_available?, #is_this_binary_registered?, #is_this_program_included?, #make_command?, #make_install_command?, #new_cookbook_instance_for, #program_exists?, #publish_list_of_all_programs_version, #rcp, registered_binaries?, #remove_symlink, #rename_kde_konsole_tab, #repackage, #report_n_programs, #report_working_directory, #return_compile_time_statistics, #return_n_random_characters, #return_version_of_this_program, #run_make_then_make_install, #sanitize_url1_entry, #set_source_directory, #show_overview_over_available_utility_scripts, #symlink_all_files_from_this_directory_to_that_directory, #system_tags?, #upload_list_of_all_programs_version, #use_yaml_database_for_tags?, #warn_and_exit, #wget

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_arguments, #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_meson_installed?, #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_directory_was_found_at, #no_opn, #no_such_file_exists, #open_in_browser, #open_in_editor, #opncomment, #opne, #opnef, #opnerev, #opnerror, #opnesystem, #opnewarn, #opnfancy, #opnn, #otomato, #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_the_first_commandline_argument, #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_name, #return_program_name_for_gobolinux_systems, #return_program_name_via_program_information, #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, #rpn, #run_simulation=, #run_simulation?, #sdir, #sdir_return_pwd, #set_be_silent, #set_be_verbose, #set_first_commandline_argument, #set_namespace, #set_use_colours, #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(i = nil, run_already = true) ⇒ Shell

#

initialize

#


39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/rbt/shell/shell.rb', line 39

def initialize(
    i           = nil,
    run_already = true
  )
  reset
  case i
  # ======================================================================= #
  # === :dont_run_yet
  # ======================================================================= #
  when :dont_run_yet
    run_already = false
    @run_the_main_loop = false
    i = nil
  end
  set_input(i)
  case run
  when :dont_run_yet
    run_already = false
  end
  run if run_already
end

Class Method Details

.[](i = '') ⇒ Object

#

RBT::Installer::Shell[]

#


364
365
366
# File 'lib/rbt/shell/shell.rb', line 364

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

Instance Method Details

#display_colourized_comment(i) ⇒ Object

#

display_colourized_comment

Let class Colours handle the colour there, via eparse().

#


298
299
300
# File 'lib/rbt/shell/shell.rb', line 298

def display_colourized_comment(i)
  eparse(i)
end

#do_autocompileObject

#

do_autocompile

#


247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
# File 'lib/rbt/shell/shell.rb', line 247

def do_autocompile
  require 'rbt/requires/swift_version.rb'
  e
  e 'The method '+orange('do_autocompile()')+' will attempt to '\
    'compile several programs.'
  e
  e 'The target directory is currently hardcoded towards `'+sdir('/Programs/')+'`.'
  e 'This will change at a later time, to allow any directory as the main'
  e '--prefix= in use.'
  e 
  e 'This method will first check the locally available latest version of'
  e 'the programs that are to be compiled.'
  e
  e 'Compilation will only happen if the program in the Cookbooks directory'
  e 'is more recent than the locally available program.'
  e
  array = %i( sed awk )
  array.each {|this_program|
    version_in_the_cookbooks_file = RBT.return_version_of(this_program)
e 'TODO'
e 'The local version of '+this_program.to_s+' is: '+
 sfancy(version_in_the_cookbooks_file)
e 'We still have to compare this to the local version available on'
e 'this computer.'
  }
end

#do_compile_this_program(i) ⇒ Object

#

do_compile_this_program

#


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
# File 'lib/rbt/shell/shell.rb', line 162

def do_compile_this_program(i)
  i.strip!
  if i.include? ' '
    # ===================================================================== #
    # In this case we need to determine what the user wants.
    # ===================================================================== #
    splitted = i.split(' ')
    first = splitted.first
    last  = splitted.last
    case last
    # ===================================================================== #
    # === trad
    # ===================================================================== #
    when /^trad/i
      notify_the_user_that_this_program_will_be_compiled_next(first)
      action(:Installer, first) {{ prefix: 'trad' }}
      return
    end
  end
  notify_the_user_that_this_program_will_be_compiled_next(i)
  if @use_this_prefix
    _ = @use_this_prefix
    case _
    # ===================================================================== #
    # Handle AppDir prefixes next.
    # ===================================================================== #
    when :app_dir, :appdir
      _ = programs_dir?+i.to_s.capitalize+'/'+
          return_version_of_this_program(i)+'/' # ← Add the program-version here.
    end
    action(:Installer, i) {{ prefix: _ }}
  else
    action(:Installer, i)
  end
end

#edit_this_file(i = @all_arguments) ⇒ Object

#

edit_this_file (edit tag)

This method can be used to quickly edit a .yml file from within the compile-shell.

#


315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
# File 'lib/rbt/shell/shell.rb', line 315

def edit_this_file(
    i = @all_arguments
  )
  if i.is_a? Array
    i.each {|entry| edit_this_file(entry) }
  else
    i = i.dup if i.frozen?
    i << '.yml' unless i.end_with? '.yml'
    unless i.include? '/'
      i.prepend RBT.individual_cookbooks_directory?
    end
    i.prepend('nano ')
    esystem i
  end
end

#input?Boolean

#

input?

#

Returns:

  • (Boolean)


106
107
108
# File 'lib/rbt/shell/shell.rb', line 106

def input?
  @input
end
#

menu (menu tag)

#


19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/rbt/shell/menu.rb', line 19

def menu(i)
  if i.is_a? Array
    i.each {|entry| menu(entry) }
  else
    case i # case tag, menu tag
    # ===================================================================== #
    # === non_trad
    # ===================================================================== #
    when /^-?-?non(_|-)?trad$/i,
         /^-?-?app(_|-)?dir$/i,
         'ntrad'
      e 'Making use of non-traditional prefix next (aka AppDir prefix).'
      @use_this_prefix = :app_dir
    # ===================================================================== #
    # === last_update?
    # ===================================================================== #
    when /-?-?last(_|-)?update\??/,
         /show(_|-)?last(_|-)?update/
      show_last_update
    # ===================================================================== #
    # === compile-time?
    # ===================================================================== #
    when /compile(-|_)?time\??/,
         /show(-|_)?compile(-|_)?time/,
         '1',
         'stats?','stats' # <- This entry may be changed lateron when stats-functionality is added.
      show_compile_time
    # ===================================================================== #
    # === prefix?
    # ===================================================================== #
    when 'prefix?'
      query_the_prefix_in_use
    # ===================================================================== #
    # === use_this_prefix=/usr/local/
    # ===================================================================== #
    when /^use(-|_)?this(-|_)?prefix=(.+)/i,
         /^set(-|_)?prefix=(.+)/i
      _ = $2.to_s.dup
      _ = $3.to_s.dup if $3
      e 'Using this prefix: '+sfancy(_)
      set_use_this_prefix(_)
    # ===================================================================== #
    # === edit
    # ===================================================================== #
    when /edit/
      edit_this_file(@all_arguments)
    # ===================================================================== #
    # === remove_entry
    #
    # Use this entry point to remove something from the "database" of
    # compiled programs.
    #
    # Invocation example:
    #
    #   remove_entry aclocal
    #
    # ===================================================================== #
    when /remove_entry/
      if block_given?
        this_entry = yield
        remove_this_entry_from_the_database(this_entry)
      end
    # ===================================================================== #
    # === autocompile
    # ===================================================================== #
    when /^autocompile/,
         /^do(_|-)?autocompile/,
         '4'
      do_autocompile
    # ===================================================================== #
    # === available?
    # ===================================================================== #
    when /^-?-?available\??/,
         /^-?-?show(_|-)?available(_|-)?programs/,
         '2',
         '?'
      show_available_programs
    # ===================================================================== #
    # === --help
    # ===================================================================== #
    when /-?-?help/,'h'
      show_help
    # ===================================================================== #
    # === q
    # ===================================================================== #
    when 'q'
      exit
    else
      do_compile_this_program(i) unless i.to_s.empty?
    end
  end
end

#notify_the_user_that_input_can_be_passed_in_nowObject

#

notify_the_user_that_input_can_be_passed_in_now

#


113
114
115
116
117
118
119
# File 'lib/rbt/shell/shell.rb', line 113

def notify_the_user_that_input_can_be_passed_in_now
  opnn { :no_trailing }
  e
  e
  e 'Type your given input next (or pass "'+
    steelblue('help')+'" for help options):'
end

#notify_the_user_that_this_program_will_be_compiled_next(i) ⇒ Object

#

notify_the_user_that_this_program_will_be_compiled_next

This is just a notification - for the actual compile-action you have to add the code after an invocation to this method here.

#


350
351
352
# File 'lib/rbt/shell/shell.rb', line 350

def notify_the_user_that_this_program_will_be_compiled_next(i)
  e "#{rev}Next compiling `#{sfancy(i.strip)}#{rev}`."
end

#obtain_user_inputObject

#

obtain_user_input

#


124
125
126
127
128
129
130
131
132
133
134
# File 'lib/rbt/shell/shell.rb', line 124

def obtain_user_input
  if @can_we_use_readline
    @user_input = Readline.readline('', true)
    # ===================================================================== #
    # Next ignore empty input.
    # ===================================================================== #
    Readline::HISTORY.pop if @user_input.strip.empty?
  else # else use $stdin
    @user_input = $stdin.gets.chomp
  end
end

#query_the_prefix_in_useObject

#

query_the_prefix_in_use

#


201
202
203
204
205
# File 'lib/rbt/shell/shell.rb', line 201

def query_the_prefix_in_use
  prefix = '/usr/'
  prefix = @use_this_prefix if @use_this_prefix
  prefix
end

#remove_this_entry_from_the_database(i) ⇒ Object

#

remove_this_entry_from_the_database

#


277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
# File 'lib/rbt/shell/shell.rb', line 277

def remove_this_entry_from_the_database(i)
  database_location = rbt_logs?+'database_storing_compile_times.yml'
  if File.exist? database_location
    old_dataset = YAML.load_file(database_location)
    old_dataset.reject! {|key, value|
      key == i
    }
    e 'Storing the dataset into the file '+sfile(database_location)+'.'
    write_what_into(
      YAML.dump(old_dataset), database_location
    )
  else
    opnn; no_file_exists_at(database_location)
  end
end

#resetObject

#

reset (reset tag)

#


64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/rbt/shell/shell.rb', line 64

def reset
  super()
  begin
    require 'readline'
  rescue LoadError; end
  infer_the_namespace
  # ======================================================================= #
  # === @can_we_use_readline
  # ======================================================================= #
  @can_we_use_readline = Object.const_defined? :Readline
  # ======================================================================= #
  # If the following variable is set to true, then the Shell will
  # ask for user-input. This is the default.
  # ======================================================================= #
  @run_the_main_loop = true
  # ======================================================================= #
  # === @use_this_prefix
  # ======================================================================= #
  @use_this_prefix = nil
end

#return_compile_timeObject

#

return_compile_time

#


305
306
307
# File 'lib/rbt/shell/shell.rb', line 305

def return_compile_time
  action(:return_compile_time_statistics)
end

#runObject

#

run (run tag)

#


357
358
359
# File 'lib/rbt/shell/shell.rb', line 357

def run
  run_main_loop if @run_the_main_loop
end

#run_main_loopObject

#

run_main_loop

#


139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# File 'lib/rbt/shell/shell.rb', line 139

def run_main_loop
  notify_the_user_that_input_can_be_passed_in_now
  loop {
    # ===================================================================== #
    # First, we have to obtain the user input.
    # ===================================================================== #
    obtain_user_input
    i = @user_input
    if i.include? ' '
      splitted = i.split(' ')
      @all_arguments = splitted[1 .. -1].join(' ').strip
      i = splitted.first
    else
      @all_arguments = nil
    end
    a = @all_arguments
    menu(i) { a }
  }
end

#set_input(i = '') ⇒ Object

#

set_input

#


97
98
99
100
101
# File 'lib/rbt/shell/shell.rb', line 97

def set_input(i = '')
  i = i.first if i.is_a? Array
  i = i.to_s.dup
  @input = i
end

#set_use_this_prefix(i) ⇒ Object

#

set_use_this_prefix

#


88
89
90
91
92
# File 'lib/rbt/shell/shell.rb', line 88

def set_use_this_prefix(i)
  i = i.to_s.dup if i.frozen?
  i << '/' unless i.end_with? '/'
  @use_this_prefix = i
end

#show_available_programsObject

#

show_available_programs

#


210
211
212
213
214
# File 'lib/rbt/shell/shell.rb', line 210

def show_available_programs
  available_programs?.each_with_index {|this_program, index| index += 1
    e "#{sfancy(index)} #{simp(this_program)}"
  }
end

#show_compile_timeObject

#

show_compile_time

To invoke this method from the commandline, do:

RBT::Installer::Shell.new
#


339
340
341
# File 'lib/rbt/shell/shell.rb', line 339

def show_compile_time
  action(:show_compile_time_statistics)
end

#show_helpObject

#

show_help (help tag)

#


16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/rbt/shell/help.rb', line 16

def show_help
  opne 'These help options are available:'
  e
  display_colourized_comment '  show_compile_time     # (1) show the '\
    'compile-time statistics (also aliased to '+
    slateblue('stats?')+
    teal(')')+
    rev
  display_colourized_comment '  available?            # (2) show '\
    'the available programs'
  display_colourized_comment '  last_update?          # (3) show '\
    'when the last update of the last 100 programs happened'
  display_colourized_comment '  autocompile           # (4) try to '\
    'autocompile several programs'
  display_colourized_comment '  edit                  # (5) to edit '\
    'a .yml file (recipe)'
  display_colourized_comment '  remove_entry aclocal  # (6) remove '\
    'the entry "aclocal" from the database of compiled programs'
  e
  e 'You can also enable AppDir prefixes for compilation via'
  e '"nontrad".'
end

#show_last_update(n_last_programs = :default) ⇒ Object

#

show_last_update

#


219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
# File 'lib/rbt/shell/shell.rb', line 219

def show_last_update(
    n_last_programs = :default
  )
  if n_last_programs.is_a? Array
    n_last_programs = n_last_programs.first
  end
  case n_last_programs
  when :default,
       nil
    n_last_programs = DEFAULT_SHOW_N_PROGRAMS_THAT_WERE_LAST_UPDATED # Default value.
  end
  n_last_programs = n_last_programs.to_i if n_last_programs.is_a? String
  array = ::RBT::Cookbooks::ShowLastUpdated.dataset?
  result = array[0 .. (n_last_programs - 1)] # -1 because Array start at 0.
  result.each_with_index {|inner_array, index| index += 1 # ["alock", "01 Jul 2011", 55]
    name_of_the_program = inner_array.first
    last_updated_when   = inner_array[1]
    padded_index = ("#{index})").rjust(4,' ')
    e simp(padded_index)+' '+sfancy((name_of_the_program).ljust(30))+
      steelblue(
        'Last updated: '
      )+orange(last_updated_when)
  }
end