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: rivet-dev-unsubscr...@tcl.apache.org
For additional commands, e-mail: rivet-dev-h...@tcl.apache.org

Reply via email to