class RBT::Action::Cookbooks::RawCookbook
Constants
- DIRECTORY_EXPANDED_COOKBOOKS
#¶ ↑
DIRECTORY_EXPANDED_COOKBOOKS
¶ ↑Easier toplevel-constant to refer to the expanded_cookbooks/ directory.
#¶ ↑
Public Class Methods
[](i = ARGV)
click to toggle source
new( i = ARGV, run_already = true ) { || ... }
click to toggle source
#¶ ↑
initialize¶ ↑
#¶ ↑
# File lib/rbt/actions/individual_actions/cookbooks/raw_cookbook/raw_cookbook.rb, line 59 def initialize( i = ARGV, run_already = true, &block ) reset set_commandline_arguments(i) case run_already # ======================================================================= # # === :do_not_run_yet # ======================================================================= # when :do_not_run_yet run_already = false end # ======================================================================= # # === Handle blocks given to this class next # ======================================================================= # if block_given? yielded = yield case yielded # ===================================================================== # # === :do_not_run_yet # ===================================================================== # when :do_not_run_yet run_already = false # ===================================================================== # # === :simple # ===================================================================== # when :simple, :simple_cookbook set_load_what(:simple_cookbook) # ===================================================================== # # === :use_expanded_dataset # # This variant is significantly faster than the :simple variant. # ===================================================================== # when :use_expanded_dataset, :use_the_expanded_dataset, :fast, :complex set_complex # ===================================================================== # # === :be_quiet_if_the_file_was_not_found # ===================================================================== # when :be_quiet_if_the_file_was_not_found @internal_hash[:be_quiet_if_the_file_was_not_found] = true end end run if run_already end
Public Instance Methods
absolute_path_to_the_cookbook_file?()
click to toggle source
apply_patch?()
click to toggle source
#¶ ↑
apply_patch?¶ ↑
#¶ ↑
# File lib/rbt/actions/individual_actions/cookbooks/raw_cookbook/raw_cookbook.rb, line 477 def apply_patch? obtain(__method__.to_s.delete('?')) end
Also aliased as: set_apply_patch?
archive_size?()
click to toggle source
archive_type?()
click to toggle source
autosymlink_lib64?()
click to toggle source
base_dir?()
click to toggle source
be_quiet_if_the_file_was_not_found?()
click to toggle source
binaries?()
click to toggle source
blfs?()
click to toggle source
#¶ ↑
blfs?¶ ↑
#¶ ↑
# File lib/rbt/actions/individual_actions/cookbooks/raw_cookbook/raw_cookbook.rb, line 1343 def blfs? obtain(__method__.to_s.delete('?')) end
Also aliased as: blfs_homepage?
build_static?()
click to toggle source
can_be_compiled_statically?()
click to toggle source
cmake_configure_options?()
click to toggle source
configure_base_dir?()
click to toggle source
configure_command_to_use?()
click to toggle source
configure_options?()
click to toggle source
configure_options_explained?()
click to toggle source
copy_source?()
click to toggle source
dataset?()
click to toggle source
description?()
click to toggle source
directory_expanded_cookbooks?()
click to toggle source
do_autogenerate_a_new_expanded_cookbook_file_for(i)
click to toggle source
#¶ ↑
do_autogenerate_a_new_expanded_cookbook_file_for
¶ ↑
#¶ ↑
# File lib/rbt/actions/individual_actions/cookbooks/raw_cookbook/raw_cookbook.rb, line 1320 def do_autogenerate_a_new_expanded_cookbook_file_for(i) opne "#{rev}The .yml file does not exist at #{sfile(i)}#{rev}. As we are" opne "#{rev}on a roebe-system, this .yml file will be generated now." target = File.basename(i).delete_suffix('.yml') # action(:expand_cookbooks, target) # This would lead to a loop. set_load_what(:simple_cookbook) load_up_the_dataset sanitize_cookbook = action(:sanitize_cookbook, target) { :do_not_instantiate_a_new_raw_cookbook } sanitize_cookbook.merge_in_this_dataset(dataset?) sanitize_cookbook.set_raw_cookbook(self) sanitize_cookbook.do_convert_the_dataset( dataset?['url1'], dataset?['url2'] ) RBT.store_this_expanded_dataset_into_that_yaml_file( sanitize_cookbook.dataset?, i ) end
do_not_download?()
click to toggle source
do_not_symlink?()
click to toggle source
do_not_try_to_autogenerate_the_dataset_for_an_expanded_yaml_file()
click to toggle source
#¶ ↑
do_not_try_to_autogenerate_the_dataset_for_an_expanded_yaml_file
¶ ↑
#¶ ↑
# File lib/rbt/actions/individual_actions/cookbooks/raw_cookbook/raw_cookbook.rb, line 192 def do_not_try_to_autogenerate_the_dataset_for_an_expanded_yaml_file @internal_hash[:shall_we_try_to_autogenerate_the_dataset_for_an_expanded_yaml_file] = false end
Also aliased as: do_not_autogenerate
echo_yes?()
click to toggle source
enable_static?()
click to toggle source
extra_information?()
click to toggle source
extract_to?()
click to toggle source
find( for_this_program = search_for_this_program? )
click to toggle source
#¶ ↑
find (find tag)¶ ↑
#¶ ↑
# File lib/rbt/actions/individual_actions/cookbooks/raw_cookbook/raw_cookbook.rb, line 785 def find( for_this_program = search_for_this_program? ) reset_the_internal_variables load_up_the_dataset(for_this_program) end
Also aliased as: try_to_find
flatpak_url?()
click to toggle source
gir_files?()
click to toggle source
git_url?()
click to toggle source
github?()
click to toggle source
has_key?(i)
click to toggle source
#¶ ↑
has_key?¶ ↑
Query method to determine whether a specific key is present in this class.
#¶ ↑
# File lib/rbt/actions/individual_actions/cookbooks/raw_cookbook/raw_cookbook.rb, line 798 def has_key?(i) dataset?.has_key?(i) end
Also aliased as: key?
has_non_empty_BLFS_entry?()
click to toggle source
#¶ ↑
has_non_empty_BLFS_entry?¶ ↑
This method will return true if the :blfs entry is NOT empty. This will include nil, an empty String as well as an empty Array.
#¶ ↑
# File lib/rbt/actions/individual_actions/cookbooks/raw_cookbook/raw_cookbook.rb, line 1353 def has_non_empty_BLFS_entry? _ = blfs? _ and !_.empty? end
has_to_be_compiled?()
click to toggle source
headers?()
click to toggle source
homepage?()
click to toggle source
installation_steps?()
click to toggle source
is_an_active_project?()
click to toggle source
is_the_program_included?()
click to toggle source
keep_extracted?()
click to toggle source
last_update?()
click to toggle source
libexec?()
click to toggle source
libraries?()
click to toggle source
licence?()
click to toggle source
load_up_the_dataset( for_this_program = first_argument? )
click to toggle source
#¶ ↑
load_up_the_dataset
¶ ↑
This method will load the dataset from the .yml file.
#¶ ↑
# File lib/rbt/actions/individual_actions/cookbooks/raw_cookbook/raw_cookbook.rb, line 1225 def load_up_the_dataset( for_this_program = first_argument? ) unless for_this_program.is_a? String for_this_program = for_this_program.to_s end # ======================================================================= # # End early here if the program is not included. # ======================================================================= # return unless ::RBT.is_this_program_included?(for_this_program) original_name = for_this_program.dup case load_what? # ======================================================================= # # === :simple_cookbook # # This refers to the unsanitized cookbook-dataset. # ======================================================================= # when :simple_cookbook, :default, :simple _ = RBT.cookbook_directory?+ for_this_program.to_s # ======================================================================= # # === :expanded_cookbook # # This is also known as :complex. # ======================================================================= # when :expanded_cookbook, :expanded, :complex _ = ::RBT.directory_expanded_cookbooks?+ for_this_program.to_s end _ = _.dup _ << '.yml' unless _.end_with?('.yml') or _.empty? _ = absolute_path(_) # Always try as absolute path. # ======================================================================= # # Since as of January 2024, if the file does NOT exist, and we are # on a roebe-system, we will automatically generate a new .yml file. # In February 2024 it was noticed that this can lead to an infinite # loop, so the code was modified to no longer have this issue. # ======================================================================= # if !File.exist?(_) and shall_we_try_to_autogenerate_the_dataset_for_an_expanded_yaml_file? # ===================================================================== # # Autogenerate it anew in this case: # ===================================================================== # do_autogenerate_a_new_expanded_cookbook_file_for(_) end # ======================================================================= # # The file exists, so we continue here. # ======================================================================= # if File.exist? _ the_program_is_included set_absolute_path_to_the_cookbook_file(_) require 'rbt/actions/individual_actions/checks_and_validations/check_for_invalid_entries_in_this_cookbook.rb' if RBT.does_this_yaml_file_have_two_url1_entries?(cookbook_file?) opne 'Please fix the above issue first before we can continue here.' exit end # ===================================================================== # # Next, load the yaml file. # ===================================================================== # yaml_dataset = load_yaml(cookbook_file?) if dataset?.frozen? @internal_hash[:dataset_from_the_yaml_file] = @internal_hash[:dataset_from_the_yaml_file].dup end if yaml_dataset.nil? e "#{rev}No value found for the file #{sfile(cookbook_file?)}#{rev}." end @internal_hash[:dataset_from_the_yaml_file].update(yaml_dataset) if yaml_dataset if @internal_hash[:dataset_from_the_yaml_file].has_key?(original_name) and # Sync it down one level in this case. !@internal_hash[:dataset_from_the_yaml_file].has_value?(original_name) # =================================================================== # # Note that this will fail for "sed" because it may have an entry # called sed. :D # This explains the above ! check in use. # =================================================================== # @internal_hash[:dataset_from_the_yaml_file] = @internal_hash[:dataset_from_the_yaml_file][original_name] end @internal_hash[:dataset_from_the_yaml_file].freeze else the_program_is_not_included unless be_quiet_if_the_file_was_not_found? opnn; no_file_exists_at(_) end end return @internal_hash[:dataset_from_the_yaml_file] # Always return the dataset as-is. end
load_what?()
click to toggle source
#¶ ↑
load_what?¶ ↑
#¶ ↑
# File lib/rbt/actions/individual_actions/cookbooks/raw_cookbook/raw_cookbook.rb, line 346 def load_what? @internal_hash[:load_simple_or_expanded_cookbook_variant] end
Also aliased as: mode?
localstatedir?()
click to toggle source
m4_files?()
click to toggle source
maintainer?()
click to toggle source
manual_steps?()
click to toggle source
may_we_modify_the_configure_options?()
click to toggle source
md5sum?()
click to toggle source
meson_configure_options?()
click to toggle source
mirror?()
click to toggle source
modify_the_makefile?()
click to toggle source
obtain(i)
click to toggle source
#¶ ↑
obtain (obtain tag)¶ ↑
#¶ ↑
# File lib/rbt/actions/individual_actions/cookbooks/raw_cookbook/raw_cookbook.rb, line 1036 def obtain(i) result = nil dataset = dataset? if dataset string_key = i.to_s # Get our key, as a String. # ===================================================================== # # First, we try to query the main Hash via a string-key. # ===================================================================== # if dataset.has_key? string_key result = dataset[i] # ===================================================================== # # Next we try the same key, but as a Symbol. # ===================================================================== # elsif dataset.has_key? string_key.to_sym result = dataset[string_key.to_sym] else # e 'The key is not available: '+i.to_s end return result end end
optional_start_message?()
click to toggle source
override?()
click to toggle source
parameters_to_make?()
click to toggle source
pkgconfig_files?()
click to toggle source
postinstall?()
click to toggle source
pre_configure_steps?()
click to toggle source
pre_make_commands?()
click to toggle source
pre_make_install_sed?()
click to toggle source
prefix?()
click to toggle source
preinstall?()
click to toggle source
pretty_show_the_dataset()
click to toggle source
#¶ ↑
pretty_show_the_dataset
¶ ↑
#¶ ↑
# File lib/rbt/actions/individual_actions/cookbooks/raw_cookbook/raw_cookbook.rb, line 1070 def pretty_show_the_dataset # pp the dataset: pp _.dataset? dataset = dataset? pp dataset e print Colours.rev Cliner.cliner e Colours::HtmlColoursMethods.steelblue('This dataset was read from this file: ')+ Colours.sfile(cookbook_file?) e Colours::HtmlColoursMethods.steelblue('The mode is: '.ljust(38))+ Colours::HtmlColoursMethods.olivedrab(':'+mode?.to_s) e Colours::HtmlColoursMethods.steelblue('base_dir: '.ljust(38))+ Colours::HtmlColoursMethods.lightgreen(base_dir?.to_s) e Colours::HtmlColoursMethods.steelblue('program_name_and_program_version: '.ljust(38))+ Colours::HtmlColoursMethods.lightgreen(program_name_and_program_version?.to_s) e Colours::HtmlColoursMethods.steelblue('program_path: '.ljust(38))+ Colours::HtmlColoursMethods.lightgreen(program_path?.to_s) e Colours::HtmlColoursMethods.steelblue('The url1 entry is: '.ljust(38))+ Colours::HtmlColoursMethods.lightgreen(url1?.to_s) if url2? and !url2?.empty? e Colours::HtmlColoursMethods.steelblue('The url2 entry is: '.ljust(38))+ Colours::HtmlColoursMethods.lightgreen(url2?.to_s) end if homepage? and !homepage?.empty? e Colours::HtmlColoursMethods.steelblue('The homepage entry is: '.ljust(38))+ Colours::HtmlColoursMethods.lightgreen(homepage?.to_s) end e Colours::HtmlColoursMethods.steelblue('apply_patch entry is: '.ljust(38))+ Colours::HtmlColoursMethods.lightgreen(apply_patch?.to_s) if headers? and !headers?.empty? e Colours::HtmlColoursMethods.steelblue('headers entry is: '.ljust(38))+ Colours::HtmlColoursMethods.lightgreen(headers?.to_s[0 .. 40]+'[...]') end # ======================================================================= # # === prefix # ======================================================================= # e Colours::HtmlColoursMethods.steelblue('prefix: '.ljust(38))+ Colours::HtmlColoursMethods.lightgreen(prefix?.to_s) # ======================================================================= # # === use build directory # ======================================================================= # e Colours::HtmlColoursMethods.steelblue('use build directory: '.ljust(38))+ Colours::HtmlColoursMethods.lightgreen(use_build_directory?.to_s) if gir_files? and !gir_files?.empty? e Colours::HtmlColoursMethods.steelblue('gir files: '.ljust(38))+ Colours::HtmlColoursMethods.lightgreen(gir_files?.join(' ').to_s) end if pkgconfig_files? and !pkgconfig_files?.empty? e Colours::HtmlColoursMethods.steelblue('pkgconfig files: '.ljust(38))+ Colours::HtmlColoursMethods.lightgreen(pkgconfig_files?.join(' ').to_s) end if symlink_pkgconfig_files? and !symlink_pkgconfig_files?.to_s.empty? e Colours::HtmlColoursMethods.steelblue('symlink pkgconfig files: '.ljust(38))+ Colours::HtmlColoursMethods.lightgreen(symlink_pkgconfig_files?.to_s) end e Colours::HtmlColoursMethods.steelblue('symlink headers: '.ljust(38))+ Colours::HtmlColoursMethods.lightgreen(symlink_headers?.to_s) # ======================================================================= # # === configure_command_to_use # ======================================================================= # if configure_command_to_use? and !configure_command_to_use?.empty? e Colours::HtmlColoursMethods.steelblue('configure_command_to_use: '.ljust(38))+ Colours::HtmlColoursMethods.lightgreen(configure_command_to_use?.to_s) end unless flatpak_url?.to_s.empty? e Colours::HtmlColoursMethods.steelblue('flatpak_url: '.ljust(38))+ Colours::HtmlColoursMethods.lightgreen(flatpak_url?.to_s) end e Colours::HtmlColoursMethods.steelblue('configure_base_dir: '.ljust(38))+ Colours::HtmlColoursMethods.lightgreen(configure_base_dir?.to_s) # ======================================================================= # # === configure_options # ======================================================================= # if configure_options? and !configure_options?.empty? e Colours::HtmlColoursMethods.steelblue('configure_options: '.ljust(38))+ Colours::HtmlColoursMethods.lightgreen( configure_options?.to_s.tr("\n",' ').strip.squeeze(' ') ) end extra_information = extra_information? # ======================================================================= # # === extra_information # ======================================================================= # if extra_information and !extra_information.empty? content = extra_information.tr("\n",' ').strip.squeeze(' ') if content.size > 35 content = content[0 .. 35]+' [...]' end e Colours::HtmlColoursMethods.steelblue('extra_information: '.ljust(38))+ Colours::HtmlColoursMethods.lightgreen( content ) end # ======================================================================= # # === meson_configure_options # ======================================================================= # if meson_configure_options? and !meson_configure_options?.empty? e Colours::HtmlColoursMethods.steelblue('meson_configure_options: '.ljust(38))+ Colours::HtmlColoursMethods.lightgreen( meson_configure_options?.to_s.tr("\n",' ').strip.squeeze(' ') ) end if use_this_build_system? and !use_this_build_system?.empty? e Colours::HtmlColoursMethods.steelblue('use_this_build_system: '.ljust(38))+ Colours::HtmlColoursMethods.lightgreen(use_this_build_system?.to_s) end if modify_the_makefile? and !modify_the_makefile?.to_s.empty? e Colours::HtmlColoursMethods.steelblue('modify_the_makefile: '.ljust(38))+ Colours::HtmlColoursMethods.lightgreen(modify_the_makefile?.to_s) end; ee rev Cliner.cliner e end
program_name?()
click to toggle source
program_name_and_program_version?()
click to toggle source
program_path?()
click to toggle source
program_version?()
click to toggle source
rating?()
click to toggle source
recommended_deps_on?()
click to toggle source
required_deps_on?()
click to toggle source
#¶ ↑
required_deps_on?¶ ↑
#¶ ↑
# File lib/rbt/actions/individual_actions/cookbooks/raw_cookbook/raw_cookbook.rb, line 392 def required_deps_on? obtain(__method__.to_s.delete('?')) end
Also aliased as: deps?, deps?, required_dependencies_on?
reset()
click to toggle source
reset_the_internal_variables()
click to toggle source
#¶ ↑
reset_the_internal_variables
¶ ↑
#¶ ↑
# File lib/rbt/actions/individual_actions/cookbooks/raw_cookbook/raw_cookbook.rb, line 145 def reset_the_internal_variables # ======================================================================= # # === :shall_we_try_to_autogenerate_the_dataset_for_an_expanded_yaml_file # ======================================================================= # @internal_hash[:shall_we_try_to_autogenerate_the_dataset_for_an_expanded_yaml_file] = false if is_on_roebe? @internal_hash[:shall_we_try_to_autogenerate_the_dataset_for_an_expanded_yaml_file] = true end # ======================================================================= # # === :is_the_program_included # # This variable will tell us whether the program is included or # whether it is not included. By default it is assumed that # the program is NOT included, hence the false value. # ======================================================================= # @internal_hash[:is_the_program_included] = false # ======================================================================= # # === :dataset_from_the_yaml_file # # We will store all data into the following variable. The data # comes from a .yml file typically. # # Initialize the variable to an empty Hash. # ======================================================================= # @internal_hash[:dataset_from_the_yaml_file] = {} # ======================================================================= # # === :be_quiet_if_the_file_was_not_found # ======================================================================= # @internal_hash[:be_quiet_if_the_file_was_not_found] = false # ======================================================================= # # === :absolute_path_to_the_cookbook_file # # This variable will store from which location the dataset was read. # ======================================================================= # @internal_hash[:absolute_path_to_the_cookbook_file] = nil end
Also aliased as: reset_the_internal_state
reset_the_main_hash()
click to toggle source
ruby_premake_commands?()
click to toggle source
run()
click to toggle source
run_configure?()
click to toggle source
run_ldconfig?()
click to toggle source
run_make?()
click to toggle source
run_make_check?()
click to toggle source
search_for_this_program?()
click to toggle source
sed?()
click to toggle source
set_absolute_path_to_the_cookbook_file(i)
click to toggle source
set_autogenerate_expanded_dataset(i)
click to toggle source
set_complex()
click to toggle source
set_env_variables?()
click to toggle source
set_load_simple_or_expanded_cookbook_variant( i = :expanded_cookbook )
click to toggle source
#¶ ↑
set_load_simple_or_expanded_cookbook_variant
¶ ↑
#¶ ↑
# File lib/rbt/actions/individual_actions/cookbooks/raw_cookbook/raw_cookbook.rb, line 249 def set_load_simple_or_expanded_cookbook_variant( i = :expanded_cookbook ) @internal_hash[:load_simple_or_expanded_cookbook_variant] = i end
Also aliased as: set_load_what, set_mode
set_search_for_this_program( i = first_argument? )
click to toggle source
#¶ ↑
set_search_for_this_program
¶ ↑
#¶ ↑
# File lib/rbt/actions/individual_actions/cookbooks/raw_cookbook/raw_cookbook.rb, line 259 def set_search_for_this_program( i = first_argument? ) case i # ======================================================================= # # === :default # # This means to obtain the first argument given to this class. # ======================================================================= # when :default, :first_argument i = first_argument? end @internal_hash[:search_for_this_program] = i end
set_simple()
click to toggle source
set_the_default_value_for_the_cookbook_variant()
click to toggle source
#¶ ↑
set_the_default_value_for_the_cookbook_variant
¶ ↑
#¶ ↑
# File lib/rbt/actions/individual_actions/cookbooks/raw_cookbook/raw_cookbook.rb, line 123 def set_the_default_value_for_the_cookbook_variant # ======================================================================= # # === :load_simple_or_expanded_cookbook_variant # # The next variable will determine whether we will load from the # expanded cookbook-dataset or from a raw, simple .yml file. The # latter may contain less data. Ideally we should load from the # expanded_cookbook, if possible and available, as it is faster. # # The two allowed states for this variable are: # # :simple_cookbook # :expanded_cookbook # # ======================================================================= # # @internal_hash[:load_simple_or_expanded_cookbook_variant] = :simple_cookbook @internal_hash[:load_simple_or_expanded_cookbook_variant] = :expanded_cookbook end
shall_we_try_to_autogenerate_the_dataset_for_an_expanded_yaml_file?()
click to toggle source
#¶ ↑
shall_we_try_to_autogenerate_the_dataset_for_an_expanded_yaml_file?¶ ↑
#¶ ↑
# File lib/rbt/actions/individual_actions/cookbooks/raw_cookbook/raw_cookbook.rb, line 185 def shall_we_try_to_autogenerate_the_dataset_for_an_expanded_yaml_file? @internal_hash[:shall_we_try_to_autogenerate_the_dataset_for_an_expanded_yaml_file] end
short_description?()
click to toggle source
#¶ ↑
short_description?¶ ↑
#¶ ↑
# File lib/rbt/actions/individual_actions/cookbooks/raw_cookbook/raw_cookbook.rb, line 526 def short_description? obtain(__method__.to_s.delete('?')) end
Also aliased as: short_desc?
short_name?()
click to toggle source
show_help()
click to toggle source
sub_dir?()
click to toggle source
svn_url?()
click to toggle source
symlink_glib_schema?()
click to toggle source
symlink_headers?()
click to toggle source
symlink_pkgconfig_files?()
click to toggle source
the_program_is_included()
click to toggle source
the_program_is_not_included()
click to toggle source
toggle_the_state( i = load_what? )
click to toggle source
#¶ ↑
toggle_the_state
(toggle tag)¶ ↑
#¶ ↑
# File lib/rbt/actions/individual_actions/cookbooks/raw_cookbook/raw_cookbook.rb, line 353 def toggle_the_state( i = load_what? ) case i # ======================================================================= # # === :expanded_cookbook # ======================================================================= # when :expanded_cookbook @internal_hash[:load_simple_or_expanded_cookbook_variant] = :simple_cookbook else @internal_hash[:load_simple_or_expanded_cookbook_variant] = :expanded_cookbook end end
Also aliased as: toggle
url1?()
click to toggle source
url2?()
click to toggle source
url3?()
click to toggle source
url4?()
click to toggle source
url5?()
click to toggle source
use_autoconf?()
click to toggle source
use_autogen?()
click to toggle source
use_build_directory?()
click to toggle source
use_glib_schema?()
click to toggle source
use_this_build_directory?()
click to toggle source
use_this_build_system?()
click to toggle source
#¶ ↑
use_this_build_system?¶ ↑
#¶ ↑
# File lib/rbt/actions/individual_actions/cookbooks/raw_cookbook/raw_cookbook.rb, line 812 def use_this_build_system? obtain(__method__.to_s.delete('?')) end
Also aliased as: use_which_build_system?
use_this_make_command?()
click to toggle source
use_this_make_install_command?()
click to toggle source
use_this_program_name?()
click to toggle source
use_this_program_name_on_gobolinux?()
click to toggle source
wikipedia?()
click to toggle source