aboutsummaryrefslogtreecommitdiffstats
path: root/lib/LXRng/Context.pm
diff options
context:
space:
mode:
authorArne Georg Gleditsch <argggh@lxr.linpro.no>2007-07-05 00:51:08 +0200
committerArne Georg Gleditsch <argggh@lxr.linpro.no>2007-07-05 00:51:08 +0200
commite9fa4c98bb5f084739d3418ade3f0c51e34a0aa1 (patch)
treefec1d635625e031cde7cba1b0a1d95ee92ac760b /lib/LXRng/Context.pm
Rebase tree.
Diffstat (limited to 'lib/LXRng/Context.pm')
-rw-r--r--lib/LXRng/Context.pm174
1 files changed, 174 insertions, 0 deletions
diff --git a/lib/LXRng/Context.pm b/lib/LXRng/Context.pm
new file mode 100644
index 0000000..46faa21
--- /dev/null
+++ b/lib/LXRng/Context.pm
@@ -0,0 +1,174 @@
+package LXRng::Context;
+
+use strict;
+use LXRng;
+
+sub new {
+ my ($self, %args) = @_;
+
+ $self = bless({}, $self);
+
+ if ($args{'query'}) {
+ $$self{'req_url'} = $args{'query'}->url();
+
+ foreach my $p ($args{'query'}->param) {
+ $$self{'params'}{$p} = [$args{'query'}->param($p)];
+ }
+ my @prefs = $args{'query'}->cookie('lxr_prefs');
+ if (@prefs) {
+ $$self{'prefs'} = {
+ map { /^(.*?)(?:=(.*)|)$/; ($1 => $2) } @prefs };
+ }
+ @$self{'tree', 'path'} = $args{'query'}->path_info =~ m,([^/]+)/*(.*),;
+ $$self{'tree'} = $args{'query'}->param('tree')
+ if $args{'query'}->param('tree');
+ }
+ if ($args{'tree'}) {
+ $$self{'tree'} = $args{'tree'};
+ }
+
+ if ($$self{'tree'} =~ s/[+](.*)$//) {
+ $$self{'release'} = $1;
+ }
+
+ if ($$self{'tree'}) {
+ my $tree = $$self{'tree'};
+ my @config = $self->read_config();
+ die("No config for tree $tree")
+ unless ref($config[0]) eq 'HASH' and exists($config[0]{$tree});
+
+ $$self{'config'} = $config[0]{$tree};
+ }
+
+ if (exists $$self{'params'}{'v'} and $$self{'params'}{'v'}) {
+ $$self{'release'} ||= $$self{'params'}{'v'}[0];
+ delete($$self{'params'}{'v'});
+ }
+
+ if ($$self{'config'}) {
+ $$self{'release'} ||= $$self{'config'}{'ver_default'};
+ }
+
+ return $self;
+}
+
+sub read_config {
+ my ($self) = @_;
+
+ my $confpath = $LXRng::ROOT.'/lxrng.conf';
+
+ if (open(my $cfgfile, $confpath)) {
+ my @config = eval("use strict; use warnings;\n".
+ "#line 1 \"configuration file\"\n".
+ join("", <$cfgfile>));
+ die($@) if $@;
+
+ return @config;
+ }
+ else {
+ die("Couldn't open configuration file \"$confpath\".");
+ }
+}
+
+sub release {
+ my ($self, $value) = @_;
+
+ $$self{'release'} = $value if @_ == 2;
+ return $$self{'release'};
+}
+
+sub default_release {
+ my ($self, $value) = @_;
+
+ return $$self{'config'}{'ver_default'};
+}
+
+sub all_releases {
+ my ($self) = @_;
+
+ return $$self{'config'}{'ver_list'};
+}
+
+sub param {
+ my ($self, $key) = @_;
+ my @res;
+
+ @res = @{$$self{'params'}{$key}} if
+ exists $$self{'params'}{$key};
+
+ return wantarray ? @res : $res[0];
+}
+
+sub path {
+ my ($self, $value) = @_;
+
+ $$self{'path'} = $value if @_ == 2;
+ return $$self{'path'};
+}
+
+sub tree {
+ my ($self) = @_;
+
+ return $$self{'tree'};
+}
+
+sub vtree {
+ my ($self) = @_;
+
+ if ($self->release ne $self->default_release) {
+ return $self->tree.'+'.$self->release;
+ }
+ else {
+ return $self->tree;
+ }
+}
+
+sub path_elements {
+ my ($self) = @_;
+
+ return [] if $self->path =~ /^[ +]/;
+
+ my @path;
+ return [map {
+ push(@path, $_); { 'node' => $_, 'path' => join('', @path) }
+ } $self->path =~ m,([^/]+\/?),g];
+}
+
+sub config {
+ my ($self) = @_;
+
+ return $$self{'config'};
+}
+
+sub prefs {
+ my ($self) = @_;
+
+ return $$self{'prefs'};
+}
+
+sub base_url {
+ my ($self) = @_;
+
+ my $base = $self->config->{'base_url'};
+ unless ($base) {
+ $base = $$self{'req_url'};
+ $base =~ s/lxr$//;
+ }
+
+ $base =~ s,/+$,,;
+ $base .= '/lxr/'.$self->vtree.'/';
+ $base =~ s,//+$,/,;
+
+ return $base;
+}
+
+sub args_url {
+ my ($self, %args) = @_;
+
+ # Todo: escape
+ my $args = join(';', map { $_.'='.$args{$_} } keys %args);
+ $args = '?'.$args if $args;
+ return $args;
+}
+
+1;