I tried to reproduce the problem tonight but unsuccessfully.
My scheme has some small difference in that the code is placed in .rvt
files. Both scripts in A/ and B/ source an include.tcl file
handlerA.rvt:
<html>
<head><title>Handler A</title>
</head>
<body>
<?
puts "<pre>handlerA running in <b>[pwd]</b><pre>"
source include.tcl
?>
</body>
</html>
include.tcl:
puts "A:[info script] -> [pwd]
(%s/A/B/ and you get the counterpart for directory B/)
The ouptut is consistent, so more info about the internal status of your
child processes is needed.
-- Massimo
On mer, 2012-01-18 at 13:49 +0100, Sven wrote:
> Hi Massimo,
>
> I tried your approach with success. I added
> RivetServerConf BeforeScript "load_env reqenv; cd [file dirname
> $reqenv(SCRIPT_FILENAME)]"
> to our Rivet directives.
>
> But I'm not quite sure if this the right place for the command. Because
> for me it is the correction of a misbehaviour. But as long as it is not
> clear who is guilty and if there is not introduced an unwanted
> side-effect, this way sounds as a good solution.
>
> Thanks and best regards
> Sven
>
> Am 18.01.2012 12:08, schrieb Massimo Manghi:
> > Hi Sven
> >
> > I think a more practical approach could be to tell Rivet to
> > work starting from a specific directory at every request. It's
> > easy because Rivet has the BeforeScript directive for this sort
> > of things
> >
> > RivetServerConf BeforeScript "cd<my-app-root-dir>"
> >
> > you may change this command and cd into the filename dir by
> > elaborating it a bit. The filename variable is stored in one
> > of the environment variables (see 'load_env' command)
> >
> > RivetServerConf BeforeScript "load_env reqenv"
> > RivetServerConf BeforeScript "cd [file dirname $reqenv(FILENAME)]"
> >
> > Developing with Rivet I progressively moved everything
> > has to be done at each request into the BeforeScript. The more
> > I think of it the stronger I feel it's the consistent way to
> > work. Template scripts just 'fill the holes' in the template using
> > data prepared before the actual template is run.
> >
> > Keep in mind that Rivet configuration directives concatenate
> > in a single script subsequent calls to the same directive
> >
> > RivetServerConf BeforeScript "cd<my webspace>"
> > RivetServerConf BeforeScript "source myAppRequestProcessing.tcl"
> >
> > it could be your solution if your scripts assume to work starting
> > from the a specific<my webspace> directory. This feature is helpful
> > also because you may have script generic enough to be deployed
> > in different places and let the configuration set up the
> > environment for them
> >
> > -- Massimo
> >
> > On mer, 2012-01-18 at 09:47 +0100, Sven wrote:
> >> Hello Massimo,
> >>
> >> I think I found a solution. Thank you for your hint about the implicit
> >> chdir.
> >> In mod_rivet.c (after the chdir fore Apache ) I added some code to chdir
> >> also for the TCL interpreter:
> >> //XXX: Dirty fix
> >> Tcl_Obj *chdir = Tcl_NewStringObj("cd [file dirname ", -1);
> >> Tcl_IncrRefCount(chdir);
> >> Tcl_AppendToObj(chdir, r->filename, -1);
> >> Tcl_AppendToObj(chdir, "]", -1);
> >> Tcl_EvalObjEx(interp, chdir, TCL_EVAL_DIRECT);
> >> Tcl_DecrRefCount(chdir);
> >>
> >> I dont know if this robust and the most efficient way. But it works for me.
> >>
> >> In the end I don't know exactly why it is that way. The interpreter
> >> somewhere holds a structure with the cwd, which may be out of sync with
> >> different subsequent requests. But it was still working correctly in the
> >> most cases. But why it doesn't work only if some very special code is
> >> executed ...
> >>
> >> Best regards
> >> Sven
> >>
> >>
> <snipped>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]