Update of /cvsroot/fink/fink/perlmod/Fink
In directory sc8-pr-cvs5.sourceforge.net:/tmp/cvs-serv2211
Modified Files:
Tag: selfupdate_classes
ChangeLog SelfUpdate.pm
Log Message:
Massively overhaul SU::check...headed towards plugin-able format
Index: SelfUpdate.pm
===================================================================
RCS file: /cvsroot/fink/fink/perlmod/Fink/SelfUpdate.pm,v
retrieving revision 1.117.2.5
retrieving revision 1.117.2.6
diff -u -d -r1.117.2.5 -r1.117.2.6
--- SelfUpdate.pm 8 Mar 2007 03:12:30 -0000 1.117.2.5
+++ SelfUpdate.pm 8 Mar 2007 07:28:54 -0000 1.117.2.6
@@ -112,124 +112,118 @@
=cut
+# TODO: auto-detect all available classes and their descs
+our @known_method_classes = qw( rsync CVS point );
+our %known_method_descs = (
+ 'rsync' => 'rsync',
+ 'CVS' => 'cvs',
+ 'point' => 'Stick to point releases',
+);
+
sub check {
- my $method = shift;
+ my $method = shift; # requested selfupdate method to use
+
+ $method = '' if ! defined $method;
{
+ # compatibility for old calling parameters
my %methods = (
- 0 => undef,
- 1 => 'cvs',
- 2 => 'rsync',
- 'cvs' => 'cvs',
- 'rsync' => 'rsync',
+ 0 => '',
+ 1 => 'cvs',
+ 2 => 'rsync',
);
- $method = 0 if ! defined $method;
- if (! exists $methods{lc $method}) {
- die "Invalid method '$method' passed to
Selfupdate::check\n";
+ if (length $method and exists $methods{$method}) {
+ $method = $methods{$method};
}
- $method = $methods{lc $method};
}
- if (defined $method) {
+ # canonical form is all-lower-case
+ $method = lc($method);
+ my $prev_method = lc($config->param_default("SelfUpdateMethod", ''));
+
+ if ($method eq '') {
+ # no explicit method requested
+
+ if ($prev_method ne '') {
+ # use existing default
+ $method = $prev_method;
+ } else {
+ # no existing default so ask user
+
+ $method = &prompt_selection(
+ 'Choose an update method',
+ intro => 'fink needs you to choose a
SelfUpdateMethod.',
+ default => [ 'value' => 'rsync' ], # TODO:
make sure this exists
+ choices => [ map { $known_method_descs{$_} =>
lc($_) } @known_method_classes ]
+ );
+ }
+ } else {
+ # explicit method requested
&print_breaking("\n Please note: the command 'fink selfupdate' "
- . "should be used for routine updating; you
only need to use "
- . "'fink selfupdate-cvs' or 'fink
selfupdate-rsync' if you are "
- . "changing your update method. \n\n");
- }
- if (! defined $config->param("SelfUpdateMethod") and defined $method) {
- my $answer = $method;
- $answer = 'point' if !defined $answer;
- &need_devtools($answer);
- &print_breaking("fink is setting your default update method to
$answer \n");
- $config->set_param("SelfUpdateMethod", $answer);
- $config->save();
+ . "should be used for routine
updating; you only "
+ . "need to use a command like
'fink selfupdate-cvs' "
+ . "or 'fink selfupdate-rsync'
if you are changing "
+ . "your update method. \n\n");
+
+ if ($method ne $prev_method) {
+ # requested a method different from previously-saved
default
+ # better double-check that user really wants to do this
+ my $answer =
+ &prompt_boolean("The current selfupdate method
is $prev_method. "
+ . "Do you wish
to change this default method "
+ . "to $method?",
+ default => 1
+ );
+ return if !$answer;
+ }
}
- # The user has not chosen a selfupdatemethod yet, always ask
- # if the fink.conf setting is not there.
- if (! defined $config->param("SelfUpdateMethod") and ! defined $method)
{
- my $answer = &prompt_selection("Choose an update method",
- intro => "fink needs you to
choose a SelfUpdateMethod.",
- default => [ value => "rsync" ],
- choices => [
- "rsync" => "rsync",
- "cvs" => "cvs",
- "Stick to point releases" =>
"point"
- ] );
- &need_devtools($answer);
- $config->set_param("SelfUpdateMethod", $answer);
- $config->save();
+ # We temporarily disable rsync updating for 10.5, until we've decided
how to handle it
+ if ($method eq 'rsync' and $distribution eq '10.5') {
+ die "Sorry, fink doesn't support rsync updating in the 10.5
distribution at present.\n";
}
- # We temporarily disable rsync updating for 10.5, until we've decided
- # how to handle it
+ my ($subclass_use) = grep { $method eq lc($_) } @known_method_classes;
+ die "SelfUpdateMethod '$method' is not implemented\n" unless( defined
$subclass_use && length $subclass_use );
- if (($config->param("SelfUpdateMethod") eq "rsync") and ($distribution
eq "10.5")) {
- die "Sorry, fink doesn't support rsync updating in the 10.5
distribution at present.\n\n";
+ $subclass_use = "Fink::SelfUpdate::$subclass_use";
+ eval { require $subclass_use };
+ die "SelfUpdateMethod '$method' could not be loaded: [EMAIL PROTECTED]"
if $@;
+
+ &need_devtools($method); # TODO: query the subclass to have it
+ # determine if
its needed support
+ # programs
(including devtools for
+ #
build-from-source methods) are
+ # available
+
+ if ($method ne $prev_method) {
+ # save new selection (explicit change or being set for first
time)
+ &print_breaking("fink is setting your default update method to
$method \n");
+ $config->set_param("SelfUpdateMethod", $method);
+ $config->save();
}
- # By now the config param SelfUpdateMethod should be set.
- if ($config->param("SelfUpdateMethod") eq 'cvs' and $method ne 'rsync')
{
- &need_devtools('cvs');
- Fink::SelfUpdate::rsync->stamp_clear();
+ # clear remnants of any methods other than one to be used
+ foreach my $subclass (map { "Fink::SelfUpdate::$_" }
@known_method_classes) {
+ next if $subclass eq $subclass_use;
+ $subclass->stamp_clear();
+ $subclass->clear_metadata();
+ }
+
+ if ($subclass_use eq 'Fink::SelfUpdate::CVS') {
+ # TODO: make a single CVS method that is self-deterministic
+ # and migrate into the subclass
if (-d "$basepath/fink/dists/CVS") {
+ # already have a cvs checkout
&do_direct_cvs();
} else {
&setup_direct_cvs();
}
- &do_finish();
- return;
- }
- elsif ($config->param("SelfUpdateMethod") eq 'rsync' and $method ne
'cvs'){
- &need_devtools('rsync');
- Fink::SelfUpdate::rsync->do_direct();
- &do_finish();
- return;
- }
- # Hm, we were called with a different option than the default :(
- my $selfupdatemethod = $config->param("SelfUpdateMethod");
- if ($selfupdatemethod ne 'rsync' and $method eq 'rsync') {
-
- # We temporarily disable rsync updating for 10.5, until we've decided
- # how to handle it
-
- if ($distribution eq "10.5") {
- die "Sorry, fink doesn't support rsync updating in the
10.5 distribution at present.\n\n";
- }
-
- my $answer =
- &prompt_boolean("The current selfupdate method is
$selfupdatemethod. "
- . "Do you wish to change the default
selfupdate method ".
- "to rsync?", default => 1);
- if (! $answer) {
- return;
- }
- &need_devtools('rsync');
- $config->set_param("SelfUpdateMethod", "rsync");
- $config->save();
- Fink::SelfUpdate::rsync->do_direct();
- &do_finish();
- return;
- }
- if ($selfupdatemethod ne 'cvs' and $method eq 'cvs') {
- my $answer =
- &prompt_boolean("The current selfupdate method is
$selfupdatemethod. "
- . "Do you wish to change the default
selfupdate method ".
- "to cvs?", default => 1);
- if (! $answer) {
- return;
- }
- &need_devtools('cvs');
- $config->set_param("SelfUpdateMethod", "cvs");
- $config->save();
- &setup_direct_cvs();
- &do_finish();
- return;
- }
- if (($config->param("SelfUpdateMethod") eq "point")) {
- Fink::SelfUpdate::point->do_direct();
- &do_finish();
+ } else {
+ $subclass_use->do_direct();
}
+ $subclass_use->stamp_set();
+ &do_finish();
}
=item need_devtools
Index: ChangeLog
===================================================================
RCS file: /cvsroot/fink/fink/perlmod/Fink/ChangeLog,v
retrieving revision 1.1439.2.6
retrieving revision 1.1439.2.7
diff -u -d -r1.1439.2.6 -r1.1439.2.7
--- ChangeLog 8 Mar 2007 03:12:29 -0000 1.1439.2.6
+++ ChangeLog 8 Mar 2007 07:28:53 -0000 1.1439.2.7
@@ -1,3 +1,9 @@
+2007-03-08 Daniel Macks <[EMAIL PROTECTED]>
+
+ * SelfUpdate.pm: completely redo check(), removing most
+ special-case method tests
+ * SelfUpdate.pm, SelfUpdate/*: remove all cross-method interactions
+
2007-03-07 Daniel Macks <[EMAIL PROTECTED]>
* SelfUpdate.pm, SelfUpdate/*: clean up imports from other pkgs
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Fink-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/fink-commits