1 # This module is part of debbugs, and is released
2 # under the terms of the GPL version 2, or any later
3 # version at your option.
4 # See the file README and COPYING for more information.
6 # Copyright 2007 by Don Armstrong <don@donarmstrong.com>.
8 package Debbugs::Config;
12 Debbugs::Config -- Configuration information for debbugs
18 # to get the compatiblity interface
20 use Debbugs::Config qw(:globals);
24 This module provides configuration variables for all of debbugs.
26 =head1 CONFIGURATION FILES
28 The default configuration file location is /etc/debbugs/config; this
29 configuration file location can be set by modifying the
30 DEBBUGS_CONFIG_FILE env variable to point at a different location.
36 use vars qw($VERSION $DEBUG %EXPORT_TAGS @EXPORT_OK @EXPORT $USING_GLOBALS %config);
37 use base qw(Exporter);
40 # set the version for version checking
42 $DEBUG = 0 unless defined $DEBUG;
46 %EXPORT_TAGS = (globals => [qw($gEmailDomain $gListDomain $gWebHost $gWebHostBugDir),
47 qw($gWebDomain $gHTMLSuffix $gCGIDomain $gMirrors),
48 qw($gPackagePages $gSubscriptionDomain $gProject $gProjectTitle),
49 qw($gMaintainer $gMaintainerWebpage $gMaintainerEmail $gUnknownMaintainerEmail),
50 qw($gSubmitList $gMaintList $gQuietList $gForwardList),
51 qw($gDoneList $gRequestList $gSubmitterList $gControlList),
53 qw($gBugSubscriptionDomain),
54 qw($gPackageVersionRe),
55 qw($gSummaryList $gMirrorList $gMailer $gBug),
56 qw($gBugs $gRemoveAge $gSaveOldBugs $gDefaultSeverity),
57 qw($gShowSeverities $gBounceFroms $gConfigDir $gSpoolDir),
58 qw($gIncomingDir $gWebDir $gDocDir $gMaintainerFile),
59 qw($gMaintainerFileOverride $gPseudoMaintFile $gPseudoDescFile $gPackageSource),
60 qw($gVersionPackagesDir $gVersionIndex $gBinarySourceMap $gSourceBinaryMap),
61 qw($gVersionTimeIndex),
62 qw($gSendmail $gLibPath $gSpamScan @gExcludeFromControl),
63 qw(%gSeverityDisplay @gTags @gSeverityList @gStrongSeverities),
64 qw(%gTagsSingleLetter),
66 qw(%gDistributionAliases),
67 qw(%gObsoleteSeverities),
68 qw(@gPostProcessall @gRemovalDefaultDistributionTags @gRemovalDistributionTags @gRemovalArchitectures),
69 qw(@gRemovalStrongSeverityDefaultDistributionTags),
70 qw(@gDefaultArchitectures),
74 qw($gSpamMaxThreads $gSpamSpamsPerThread $gSpamKeepRunning $gSpamScan $gSpamCrossassassinDb),
76 text => [qw($gBadEmailPrefix $gHTMLTail $gHTMLExpireNote),
78 config => [qw(%config)],
81 Exporter::export_ok_tags(qw(globals text config));
82 $EXPORT_TAGS{all} = [@EXPORT_OK];
83 $ENV{HOME} = '' if not defined $ENV{HOME};
86 use File::Basename qw(dirname);
90 =head1 CONFIGURATION VARIABLES
92 =head2 General Configuration
100 # untaint $ENV{DEBBUGS_CONFIG_FILE} if it's owned by us
101 # This enables us to test things that are -T.
102 if (exists $ENV{DEBBUGS_CONFIG_FILE}) {
103 if (${[stat($ENV{DEBBUGS_CONFIG_FILE})]}[4] = $<) {
104 $ENV{DEBBUGS_CONFIG_FILE} =~ /(.+)/;
105 $ENV{DEBBUGS_CONFIG_FILE} = $1;
108 die "Environmental variable DEBBUGS_CONFIG_FILE set, and $ENV{DEBBUGS_CONFIG_FILE} is not owned by the user running this script.";
111 read_config(exists $ENV{DEBBUGS_CONFIG_FILE}?$ENV{DEBBUGS_CONFIG_FILE}:'/etc/debbugs/config');
113 =item email_domain $gEmailDomain
115 The email domain of the bts
119 set_default(\%config,'email_domain','bugs.something');
121 =item list_domain $gListDomain
123 The list domain of the bts, defaults to the email domain
127 set_default(\%config,'list_domain',$config{email_domain});
129 =item web_host $gWebHost
131 The web host of the bts; defaults to the email domain
135 set_default(\%config,'web_host',$config{email_domain});
137 =item web_host_bug_dir $gWebHostDir
139 The directory of the web host on which bugs are kept, defaults to C<''>
143 set_default(\%config,'web_host_bug_dir','');
145 =item web_domain $gWebDomain
147 Full path of the web domain where bugs are kept, defaults to the
148 concatenation of L</web_host> and L</web_host_bug_dir>
152 set_default(\%config,'web_domain',$config{web_host}.($config{web_host}=~m{/$}?'':'/').$config{web_host_bug_dir});
154 =item html_suffix $gHTMLSuffix
156 Suffix of html pages, defaults to .html
160 set_default(\%config,'html_suffix','.html');
162 =item cgi_domain $gCGIDomain
164 Full path of the web domain where cgi scripts are kept. Defaults to
165 the concatentation of L</web_host> and cgi.
169 set_default(\%config,'cgi_domain',$config{web_domain}.($config{web_domain}=~m{/$}?'':'/').'cgi');
171 =item mirrors @gMirrors
173 List of mirrors [What these mirrors are used for, no one knows.]
178 set_default(\%config,'mirrors',[]);
180 =item package_pages $gPackagePages
182 Domain where the package pages are kept; links should work in a
183 package_pages/foopackage manner. Defaults to undef, which means that
184 package links will not be made.
189 set_default(\%config,'package_pages',undef);
191 =item package_pages $gUsertagPackageDomain
193 Domain where where usertags of packages belong; defaults to $gPackagePages
197 set_default(\%config,'usertag_package_domain',$config{package_pages});
200 =item subscription_domain $gSubscriptionDomain
202 Domain where subscriptions to package lists happen
207 set_default(\%config,'subscription_domain',undef);
214 =head2 Project Identification
218 =item project $gProject
226 set_default(\%config,'project','Something');
228 =item project_title $gProjectTitle
230 Name of this install of Debbugs, defaults to "L</project> Debbugs Install"
232 Default: "$config{project} Debbugs Install"
236 set_default(\%config,'project_title',"$config{project} Debbugs Install");
238 =item maintainer $gMaintainer
240 Name of the maintainer of this debbugs install
242 Default: 'Local DebBugs Owner's
246 set_default(\%config,'maintainer','Local DebBugs Owner');
248 =item maintainer_webpage $gMaintainerWebpage
250 Webpage of the maintainer of this install of debbugs
252 Default: "$config{web_domain}/~owner"
256 set_default(\%config,'maintainer_webpage',"$config{web_domain}/~owner");
258 =item maintainer_email $gMaintainerEmail
260 Email address of the maintainer of this Debbugs install
262 Default: 'root@'.$config{email_domain}
266 set_default(\%config,'maintainer_email','root@'.$config{email_domain});
268 =item unknown_maintainer_email
270 Email address where packages with an unknown maintainer will be sent
272 Default: $config{maintainer_email}
278 set_default(\%config,'unknown_maintainer_email',$config{maintainer_email});
282 The name of the machine that this instance of debbugs is running on
283 (currently used for debbuging purposes and web page output.)
285 Default: qx(hostname --fqdn)
291 my $_old_path = $ENV{PATH};
292 $ENV{PATH} = '/bin:/usr/bin:/usr/local/bin';
293 my $temp_hostname = qx(hostname --fqdn);
294 chomp $temp_hostname;
295 set_default(\%config,'machine_name',$temp_hostname);
296 $ENV{PATH} = $_old_path;
298 =head2 BTS Mailing Lists
325 set_default(\%config, 'submit_list', 'bug-submit-list');
326 set_default(\%config, 'maint_list', 'bug-maint-list');
327 set_default(\%config, 'quiet_list', 'bug-quiet-list');
328 set_default(\%config, 'forward_list', 'bug-forward-list');
329 set_default(\%config, 'done_list', 'bug-done-list');
330 set_default(\%config, 'request_list', 'bug-request-list');
331 set_default(\%config,'submitter_list','bug-submitter-list');
332 set_default(\%config, 'control_list', 'bug-control-list');
333 set_default(\%config, 'summary_list', 'bug-summary-list');
334 set_default(\%config, 'mirror_list', 'bug-mirror-list');
335 set_default(\%config, 'strong_list', 'bug-strong-list');
337 =item bug_subscription_domain
339 Domain of list for messages regarding a single bug; prefixed with
340 bug=${bugnum}@ when bugs are actually sent out. Set to undef or '' to
341 disable sending messages to the bug subscription list.
349 set_default(\%config,'bug_subscription_domain',$config{list_domain});
358 set_default(\%config,'mailer','exim');
359 set_default(\%config,'bug','bug');
360 set_default(\%config,'bugs','bugs');
364 Age at which bugs are archived/removed
370 set_default(\%config,'remove_age',28);
374 Whether old bugs are saved or deleted
380 set_default(\%config,'save_old_bugs',1);
382 =item distribution_aliases
384 Map of distribution aliases to the distribution name
387 {experimental => 'experimental',
388 unstable => 'unstable',
389 testing => 'testing',
391 oldstable => 'oldstable',
395 sarge => 'oldstable',
400 set_default(\%config,'distribution_aliases',
401 {experimental => 'experimental',
402 unstable => 'unstable',
403 testing => 'testing',
405 oldstable => 'oldstable',
409 sarge => 'oldstable',
417 List of valid distributions
419 Default: The values of the distribution aliases map.
423 my %_distributions_default;
424 @_distributions_default{values %{$config{distribution_aliases}}} = values %{$config{distribution_aliases}};
425 set_default(\%config,'distributions',[keys %_distributions_default]);
428 =item default_architectures
430 List of default architectures to use when architecture(s) are not
433 Default: i386 amd64 arm ppc sparc alpha
437 set_default(\%config,'default_architectures',
438 [qw(i386 amd64 arm powerpc sparc alpha)]
441 =item affects_distribution_tags
443 List of tags which restrict the buggy state to a set of distributions.
445 The set of distributions that are buggy is the intersection of the set
446 of distributions that would be buggy without reference to these tags
447 and the set of these tags that are distributions which are set on a
450 Setting this to [] will remove this feature.
452 Default: @{$config{distributions}}
456 set_default(\%config,'affects_distribution_tags',
457 [@{$config{distributions}}],
460 =item removal_unremovable_tags
462 Bugs which have these tags set cannot be archived
468 set_default(\%config,'removal_unremovable_tags',
472 =item removal_distribution_tags
474 Tags which specifiy distributions to check
476 Default: @{$config{distributions}}
480 set_default(\%config,'removal_distribution_tags',
481 [@{$config{distributions}}]);
483 =item removal_default_distribution_tags
485 For removal/archival purposes, all bugs are assumed to have these tags
488 Default: qw(unstable testing);
492 set_default(\%config,'removal_default_distribution_tags',
493 [qw(unstable testing)]
496 =item removal_strong_severity_default_distribution_tags
498 For removal/archival purposes, all bugs with strong severity are
499 assumed to have these tags set.
501 Default: qw(unstable testing stable);
505 set_default(\%config,'removal_strong_severity_default_distribution_tags',
506 [qw(unstable testing stable)]
510 =item removal_architectures
512 For removal/archival purposes, these architectures are consulted if
513 there is more than one architecture applicable. If the bug is in a
514 package not in any of these architectures, the architecture actually
515 checked is undefined.
517 Default: value of default_architectures
521 set_default(\%config,'removal_architectures',
522 $config{default_architectures},
526 =item package_name_re
528 The regex which will match a package name
530 Default: '[a-z0-9][a-z0-9\.+-]+'
534 set_default(\%config,'package_name_re',
535 '[a-z0-9][a-z0-9\.+-]+');
537 =item package_version_re
539 The regex which will match a package version
541 Default: '[A-Za-z0-9:+\.-]+'
546 set_default(\%config,'package_version_re',
547 '[A-Za-z0-9:+\.~-]+');
550 =item default_package
552 This is the name of the default package. If set, bugs assigned to
553 packages without a maintainer and bugs missing a Package: psuedoheader
554 will be assigned to this package instead.
556 Defaults to unset, which is the traditional debbugs behavoir
560 set_default(\%config,'default_package',
565 =item control_internal_requester
567 This address is used by Debbugs::Control as the request address which
568 sent a control request for faked log messages.
570 Default:"Debbugs Internal Request <$config{maintainer_email}>"
574 set_default(\%config,'control_internal_requester',
575 "Debbugs Internal Request <$config{maintainer_email}>",
578 =item control_internal_request_addr
580 This address is used by Debbugs::Control as the address to which a
581 faked log message request was sent.
583 Default: "internal_control\@$config{email_domain}";
587 set_default(\%config,'control_internal_request_addr',
588 'internal_control@'.$config{email_domain},
592 =item exclude_from_control
594 Addresses which are not allowed to send messages to control
598 set_default(\%config,'exclude_from_control',[]);
602 =item default_severity
604 The default severity of bugs which have no severity set
610 set_default(\%config,'default_severity','normal');
612 =item severity_display
614 A hashref of severities and the informative text which describes them.
618 {critical => "Critical $config{bugs}",
619 grave => "Grave $config{bugs}",
620 normal => "Normal $config{bugs}",
621 wishlist => "Wishlist $config{bugs}",
626 set_default(\%config,'severity_display',{critical => "Critical $config{bugs}",
627 grave => "Grave $config{bugs}",
628 serious => "Serious $config{bugs}",
629 important=> "Important $config{bugs}",
630 normal => "Normal $config{bugs}",
631 minor => "Minor $config{bugs}",
632 wishlist => "Wishlist $config{bugs}",
635 =item show_severities
637 A scalar list of the severities to show
639 Defaults to the concatenation of the keys of the severity_display
640 hashlist with ', ' above.
644 set_default(\%config,'show_severities',join(', ',keys %{$config{severity_display}}));
646 =item strong_severities
648 An arrayref of the serious severities which shoud be emphasized
650 Default: [qw(critical grave)]
654 set_default(\%config,'strong_severities',[qw(critical grave)]);
658 An arrayref of a list of the severities
660 Defaults to the keys of the severity display hashref
664 set_default(\%config,'severity_list',[keys %{$config{severity_display}}]);
666 =item obsolete_severities
668 A hashref of obsolete severities with the replacing severity
674 set_default(\%config,'obsolete_severities',{});
678 An arrayref of the tags used
680 Default: [qw(patch wontfix moreinfo unreproducible fixed)] and also
681 includes the distributions.
685 set_default(\%config,'tags',[qw(patch wontfix moreinfo unreproducible fixed),
686 @{$config{distributions}}
689 set_default(\%config,'tags_single_letter',
693 unreproducible => 'R',
698 set_default(\%config,'bounce_froms','^mailer|^da?emon|^post.*mast|^root|^wpuser|^mmdf|^smt.*|'.
699 '^mrgate|^vmmail|^mail.*system|^uucp|-maiser-|^mal\@|'.
700 '^mail.*agent|^tcpmail|^bitmail|^mailman');
702 set_default(\%config,'config_dir',dirname(exists $ENV{DEBBUGS_CONFIG_FILE}?$ENV{DEBBUGS_CONFIG_FILE}:'/etc/debbugs/config'));
703 set_default(\%config,'spool_dir','/var/lib/debbugs/spool');
707 Directory which contains the usertags
709 Default: $config{spool_dir}/user
713 set_default(\%config,'usertag_dir',$config{spool_dir}.'/user');
714 set_default(\%config,'incoming_dir','incoming');
715 set_default(\%config,'web_dir','/var/lib/debbugs/www');
716 set_default(\%config,'doc_dir','/var/lib/debbugs/www/txt');
717 set_default(\%config,'lib_path','/usr/lib/debbugs');
722 directory of templates; defaults to /usr/share/debbugs/templates.
726 set_default(\%config,'template_dir','/usr/share/debbugs/templates');
729 set_default(\%config,'maintainer_file',$config{config_dir}.'/Maintainers');
730 set_default(\%config,'maintainer_file_override',$config{config_dir}.'/Maintainers.override');
731 set_default(\%config,'pseudo_maint_file',$config{config_dir}.'/pseudo-packages.maint');
732 set_default(\%config,'pseudo_desc_file',$config{config_dir}.'/pseudo-packages.description');
733 set_default(\%config,'package_source',$config{config_dir}.'/indices/sources');
736 =item version_packages_dir
738 Location where the version package information is kept; defaults to
739 spool_dir/../versions/pkg
743 set_default(\%config,'version_packages_dir',$config{spool_dir}.'/../versions/pkg');
745 =item version_time_index
747 Location of the version/time index file. Defaults to
748 spool_dir/../versions/idx/versions_time.idx if spool_dir/../versions
749 exists; otherwise defaults to undef.
754 set_default(\%config,'version_time_index', -d $config{spool_dir}.'/../versions' ? $config{spool_dir}.'/../versions/indices/versions_time.idx' : undef);
758 Location of the version index file. Defaults to
759 spool_dir/../versions/indices/versions.idx if spool_dir/../versions
760 exists; otherwise defaults to undef.
764 set_default(\%config,'version_index',-d $config{spool_dir}.'/../versions' ? $config{spool_dir}.'/../versions/indices/versions.idx' : undef);
766 =item binary_source_map
768 Location of the binary -> source map. Defaults to
769 spool_dir/../versions/indices/bin2src.idx if spool_dir/../versions
770 exists; otherwise defaults to undef.
774 set_default(\%config,'binary_source_map',-d $config{spool_dir}.'/../versions' ? $config{spool_dir}.'/../versions/indices/binsrc.idx' : undef);
776 =item source_binary_map
778 Location of the source -> binary map. Defaults to
779 spool_dir/../versions/indices/src2bin.idx if spool_dir/../versions
780 exists; otherwise defaults to undef.
784 set_default(\%config,'source_binary_map',-d $config{spool_dir}.'/../versions' ? $config{spool_dir}.'/../versions/indices/srcbin.idx' : undef);
788 set_default(\%config,'post_processall',[]);
792 Sets the sendmail binary to execute; defaults to /usr/lib/sendmail
796 set_default(\%config,'sendmail','/usr/lib/sendmail');
800 Whether or not spamscan is being used; defaults to 0 (not being used
804 set_default(\%config,'spam_scan',0);
806 =item spam_crossassassin_db
808 Location of the crosassassin database, defaults to
809 spool_dir/../CrossAssassinDb
813 set_default(\%config,'spam_crossassassin_db',$config{spool_dir}.'/../CrossAssassinDb');
817 Maximum number of cross-posted messages
821 set_default(\%config,'spam_max_cross',6);
824 =item spam_spams_per_thread
826 Number of spams for each thread (on average). Defaults to 200
830 set_default(\%config,'spam_spams_per_thread',200);
832 =item spam_max_threads
834 Maximum number of threads to start. Defaults to 20
838 set_default(\%config,'spam_max_threads',20);
840 =item spam_keep_running
842 Maximum number of seconds to run without restarting. Defaults to 3600.
846 set_default(\%config,'spam_keep_running',3600);
850 Location to store spam messages; is run through strftime to allow for
851 %d,%m,%Y, et al. Defaults to 'spool_dir/../mail/spam/assassinated.%Y-%m-%d'
855 set_default(\%config,'spam_mailbox',$config{spool_dir}.'/../mail/spam/assassinated.%Y-%m-%d');
857 =item spam_crossassassin_mailbox
859 Location to store crossassassinated messages; is run through strftime
860 to allow for %d,%m,%Y, et al. Defaults to
861 'spool_dir/../mail/spam/crossassassinated.%Y-%m-%d'
865 set_default(\%config,'spam_crossassassin_mailbox',$config{spool_dir}.'/../mail/spam/crossassassinated.%Y-%m-%d');
867 =item spam_local_tests_only
869 Whether only local tests are run, defaults to 0
873 set_default(\%config,'spam_local_tests_only',0);
875 =item spam_user_prefs
877 User preferences for spamassassin, defaults to $ENV{HOME}/.spamassassin/user_prefs
881 set_default(\%config,'spam_user_prefs',"$ENV{HOME}/.spamassassin/user_prefs");
885 Site rules directory for spamassassin, defaults to
886 '/usr/share/spamassassin'
890 set_default(\%config,'spam_rules_dir','/usr/share/spamassassin');
897 The following are the only text fields in general use in the scripts;
898 a few additional text fields are defined in text.in, but are only used
899 in db2html and a few other specialty scripts.
901 Earlier versions of debbugs defined these values in /etc/debbugs/text,
902 but now they are required to be in the configuration file. [Eventually
903 the longer ones will move out into a fully fledged template system.]
909 =item bad_email_prefix
911 This prefixes the text of all lines in a bad e-mail message ack.
915 set_default(\%config,'bad_email_prefix','');
918 =item text_instructions
920 This gives more information about bad e-mails to receive.in
924 set_default(\%config,'text_instructions',$config{bad_email_prefix});
928 This shows up at the end of (most) html pages
930 In many pages this has been replaced by the html/tail template.
934 set_default(\%config,'html_tail',<<END);
935 <ADDRESS>$config{maintainer} <<A HREF=\"mailto:$config{maintainer_email}\">$config{maintainer_email}</A>>.
941 <A HREF=\"http://$config{web_domain}/\">Debian $config{bug} tracking system</A><BR>
942 Copyright (C) 1999 Darren O. Benham,
943 1997,2003 nCipher Corporation Ltd,
949 =item html_expire_note
951 This message explains what happens to archive/remove-able bugs
955 set_default(\%config,'html_expire_note',
956 "(Closed $config{bugs} are archived $config{remove_age} days after the last related message is received.)");
964 my ($conf_file) = @_;
965 # first, figure out what type of file we're reading in.
966 my $fh = new IO::File $conf_file,'r'
967 or die "Unable to open configuration file $conf_file for reading: $!";
968 # A new version configuration file must have a comment as its first line
969 my $first_line = <$fh>;
970 my ($version) = defined $first_line?$first_line =~ /VERSION:\s*(\d+)/i:undef;
971 if (defined $version) {
974 die "Version 1 configuration files not implemented yet";
977 die "Version $version configuration files are not supported";
981 # Ugh. Old configuration file
982 # What we do here is we create a new Safe compartment
983 # so fucked up crap in the config file doesn't sink us.
984 my $cpt = new Safe or die "Unable to create safe compartment";
985 # perldoc Opcode; for details
986 $cpt->permit('require',':filesys_read','entereval','caller','pack','unpack','dofile');
987 $cpt->reval(qq(require '$conf_file';));
988 die "Error in configuration file: $@" if $@;
989 # Now what we do is check out the contents of %EXPORT_TAGS to see exactly which variables
990 # we want to glob in from the configuration file
991 for my $variable (@{$EXPORT_TAGS{globals}}) {
992 my ($hash_name,$glob_name,$glob_type) = __convert_name($variable);
993 my $var_glob = $cpt->varglob($glob_name);
994 my $value; #= $cpt->reval("return $variable");
995 # print STDERR "$variable $value",qq(\n);
996 if (defined $var_glob) {{
998 if ($glob_type eq '%') {
999 $value = {%{*{$var_glob}}} if defined *{$var_glob}{HASH};
1001 elsif ($glob_type eq '@') {
1002 $value = [@{*{$var_glob}}] if defined *{$var_glob}{ARRAY};
1005 $value = ${*{$var_glob}};
1007 # We punt here, because we can't tell if the value was
1008 # defined intentionally, or if it was just left alone;
1009 # this tries to set sane defaults.
1010 set_default(\%config,$hash_name,$value) if defined $value;
1017 my ($variable) = @_;
1018 my $hash_name = $variable;
1019 $hash_name =~ s/^([\$\%\@])g//;
1021 my $glob_name = 'g'.$hash_name;
1022 $hash_name =~ s/(HTML|CGI)/ucfirst(lc($1))/ge;
1023 $hash_name =~ s/^([A-Z]+)/lc($1)/e;
1024 $hash_name =~ s/([A-Z]+)/'_'.lc($1)/ge;
1025 return $hash_name unless wantarray;
1026 return ($hash_name,$glob_name,$glob_type);
1031 # sets the configuration hash to the default value if it's not set,
1032 # otherwise doesn't do anything
1033 # If $USING_GLOBALS, then sets an appropriate global.
1036 my ($config,$option,$value) = @_;
1038 if ($USING_GLOBALS) {
1039 # fix up the variable name
1040 $varname = 'g'.join('',map {ucfirst $_} split /_/, $option);
1041 # Fix stupid HTML names
1042 $varname =~ s/(Html|Cgi)/uc($1)/ge;
1044 # update the configuration value
1045 if (not $USING_GLOBALS and not exists $config->{$option}) {
1046 $config->{$option} = $value;
1048 elsif ($USING_GLOBALS) {{
1050 # Need to check if a value has already been set in a global
1051 if (defined *{"Debbugs::Config::${varname}"}) {
1052 $config->{$option} = *{"Debbugs::Config::${varname}"};
1055 $config->{$option} = $value;
1058 if ($USING_GLOBALS) {{
1060 *{"Debbugs::Config::${varname}"} = $config->{$option};
1067 # All we care about here is whether we've been called with the globals or text option;
1068 # if so, then we need to export some symbols back up.
1069 # In any event, we call exporter.
1072 if (grep /^:(?:text|globals)$/, @_) {
1074 for my $variable (map {@$_} @EXPORT_TAGS{map{(/^:(text|globals)$/?($1):())} @_}) {
1075 my $tmp = $variable;
1077 # Yes, I don't care if these are only used once
1079 # No, it doesn't bother me that I'm assigning an undefined value to a typeglob
1081 my ($hash_name,$glob_name,$glob_type) = __convert_name($variable);
1082 $tmp =~ s/^[\%\$\@]//;
1083 *{"Debbugs::Config::${tmp}"} = ref($config{$hash_name})?$config{$hash_name}:\$config{$hash_name};
1086 Debbugs::Config->export_to_level(1,@_);