Class: RBT::Cookbooks::FindDuplicateBinaries

Inherits:
Base show all
Defined in:
lib/rbt/cookbooks/find_duplicate_binaries.rb

Overview

RBT::Cookbooks::FindDuplicateBinaries

Constant Summary collapse

DELETE_DUPLICATE_FILES =
#

DELETE_DUPLICATE_FILES

If this constant is true then we will also delete the duplicate binaries. This can be toggled by the user on the commandline.

By default, we will NOT delete the duplicate entries and this will also not be changed. The user specifically has to enable it on his/her own.

#
false

Constants inherited from LeanPrototype

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

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) ⇒ FindDuplicateBinaries

#

initialize

#


48
49
50
51
52
53
54
55
# File 'lib/rbt/cookbooks/find_duplicate_binaries.rb', line 48

def initialize(
    i           = nil,
    run_already = true
  )
  reset
  set_input(i)
  run if run_already
end

Instance Method Details

#are_the_two_target_directories_the_same_directory?Boolean

#

are_the_two_target_directories_the_same_directory?

#

Returns:

  • (Boolean)


264
265
266
# File 'lib/rbt/cookbooks/find_duplicate_binaries.rb', line 264

def are_the_two_target_directories_the_same_directory?
  sysdir == ubin_dir
end

#delete_duplicates?Boolean

#

delete_duplicates?

#

Returns:

  • (Boolean)


72
73
74
# File 'lib/rbt/cookbooks/find_duplicate_binaries.rb', line 72

def delete_duplicates?
  @delete_duplicate_files
end

#detect_duplicate_filesObject

#

detect_duplicate_files

This will detect all duplicate files.

#


200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
# File 'lib/rbt/cookbooks/find_duplicate_binaries.rb', line 200

def detect_duplicate_files
  @duplicate_files = [] # Empty at the beginning.
  ubin_array   = @usr_bin.map {|entry| File.basename(entry) }.sort
  sysbin_array = @system_executables.map {|entry| File.basename(entry) }.sort
  counter = 0
  # ======================================================================= #
  # Next, compare the ubin-array with the sysbin-array:
  # ======================================================================= #
  ubin_array.each {|entry|
    if sysbin_array.include? entry
      counter += 1
      _ = ("(#{simp(counter.to_s)}) ").rjust(20)
      e _+'Yes, '+slateblue(entry)+' is included. It is thus '+
        steelblue('a duplicate')+'.'
      @duplicate_files << entry
    end
  }
  @duplicate_files.sort! # And keep them sorted alphabetically.
end

#do_delete_duplicate_filesObject

#

do_delete_duplicate_files

This will delete only files in the /usr/bin/ hierarchy.

#


168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
# File 'lib/rbt/cookbooks/find_duplicate_binaries.rb', line 168

def do_delete_duplicate_files
  if delete_duplicates? and !@duplicate_files.empty?
    opne 'Now deleting duplicate files from the '+sdir(ubin?)+
         rev+' directory.'
    @duplicate_files.each {|entry|
      _ = sysbin?+File.basename(entry)
      if File.exist? _ # Extra safeguard here.
        e 'The file path at '+
          sfile(ubin?+entry)+
          ' is a duplicate '\
          'of `'+sfile(File.readlink(_))+'`.'
        e "Thus we can delete `#{sfile(ubin?+entry)}`."
        delete(ubin?+entry) # Delete it finally.
      end
    }
  end
end

#found_duplicates?Boolean

#

found_duplicates?

#

Returns:

  • (Boolean)


110
111
112
# File 'lib/rbt/cookbooks/find_duplicate_binaries.rb', line 110

def found_duplicates?
  !@duplicate_files.empty?
end

#grab_files_from_system_index_bin(i = sysbin_directory?) ) ⇒ Object

#

grab_files_from_system_index_bin

This will typically obtain all entries from /System/Index/bin/.

#


191
192
193
# File 'lib/rbt/cookbooks/find_duplicate_binaries.rb', line 191

def grab_files_from_system_index_bin(i = sysbin_directory?)
  @system_executables = Dir["#{i}*"]
end

#grab_files_from_usr_binObject

#

grab_files_from_usr_bin

#


95
96
97
# File 'lib/rbt/cookbooks/find_duplicate_binaries.rb', line 95

def grab_files_from_usr_bin
  @usr_bin = Dir["#{ubin_dir}*"]
end

#input?Boolean

#

input?

#

Returns:

  • (Boolean)


88
89
90
# File 'lib/rbt/cookbooks/find_duplicate_binaries.rb', line 88

def input?
  @input
end
#

menu

#


117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/rbt/cookbooks/find_duplicate_binaries.rb', line 117

def menu(
    i = @input
  )
  i = i.first if i.is_a? Array
  case i # case tag
  # ======================================================================= #
  # === duplicate_binaries --help
  # ======================================================================= #
  when /^-?-?help$/i
    show_help_options
    exit
  # ======================================================================= #
  # === duplicate_binaries --delete
  # ======================================================================= #
  when /^-?-?delete$/i,
       /^-?-?purge$/i,
       '--toggle'
    @delete_duplicate_files = true # Toggle.
  end
end

#report_duplicate_filesObject

#

report_duplicate_files

This method will report whether we have duplicate files.

#


236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
# File 'lib/rbt/cookbooks/find_duplicate_binaries.rb', line 236

def report_duplicate_files
  if found_duplicates?
    opne 'We have found these '+simp(@duplicate_files.size.to_s)+' '\
         'duplicates.'
    opne "They originate from the directory `#{sdir(ubin_dir?)}` and"
    opne 'are compared to the directory `'+sdir(sysbin_dir?)+'.'
    # ======================================================================= #
    # I am not sure why the code below exists; I assume I may have
    # wanted to show which entries are duplicates. But it is quite
    # spammy, so it was disabled on 25.05.2020. It may be re-enabled
    # at a later time, but then perhaps via a method call, and in
    # a slightly different formatted output, including colours.
    # But it may also be removed entirely instead - we will see.
    #   long_string = word_wrap(
    #     @duplicate_files.join(' ').strip, 62
    #   )
    #   long_string.chop! if long_string.end_with? ',' # Get rid of traling ','.
    #   e "  #{long_string.strip}"
    # ======================================================================= #
  else
    opne 'We did not find any duplicate entries. Thus, we will '\
         'do no further action.'
  end
end

#resetObject

#

reset (reset tag)

#


60
61
62
63
64
65
66
67
# File 'lib/rbt/cookbooks/find_duplicate_binaries.rb', line 60

def reset
  super()
  infer_the_namespace
  # ======================================================================= #
  # === @delete_duplicate_files
  # ======================================================================= #
  @delete_duplicate_files = DELETE_DUPLICATE_FILES
end

#runObject

#

run (run tag)

#


271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
# File 'lib/rbt/cookbooks/find_duplicate_binaries.rb', line 271

def run
  menu # Check for the commandline-arguments first.
  report_to_the_user_what_we_will_do_next
  if are_the_two_target_directories_the_same_directory?
    opne 'The two directories are the same, so we can not '\
         'compare them -'
    opne 'it would make no sense.'
  else
    grab_files_from_system_index_bin
    grab_files_from_usr_bin
    detect_duplicate_files
    report_duplicate_files
    do_delete_duplicate_files if delete_duplicates?
  end
end

#set_input(i = '') ⇒ Object

#

set_input

#


79
80
81
82
83
# File 'lib/rbt/cookbooks/find_duplicate_binaries.rb', line 79

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

#show_help_optionsObject

#

show_help_options (help tag)

#


141
142
143
144
145
146
147
148
# File 'lib/rbt/cookbooks/find_duplicate_binaries.rb', line 141

def show_help_options
  e 'Currently we support only one option:'
  e
  ecomment '   --delete # delete duplicate files found in '\
           'the '+sdir(ubin?)+
           comment(' hierarchy') # finddup --help
  e
end

#sysdir?Boolean Also known as: sysbin?, sysdir, main_dir?, sysbin_dir?

#

sysdir (sysdir tag)

This method will refer to “/System/Index/bin” normally - at the least on a GoboLinux-like system.

#

Returns:

  • (Boolean)


156
157
158
# File 'lib/rbt/cookbooks/find_duplicate_binaries.rb', line 156

def sysdir?
  sysbin_directory?
end

#ubin_dirObject Also known as: ubin?, ubin_dir?

#

ubin_dir

#


102
103
104
# File 'lib/rbt/cookbooks/find_duplicate_binaries.rb', line 102

def ubin_dir
  '/usr/bin/'
end