Tcl Source Code

View Ticket
Login
Ticket UUID: 591647
Title: file copy patch to copy files not links
Type: Patch Version: None
Submitter: vincentdarley Created on: 2002-08-06 16:51:19
Subsystem: 37. File System Assigned To: vincentdarley
Priority: 4 Severity:
Status: Open Last Modified: 2003-11-13 05:32:17
Resolution: Postponed Closed By: hobbs
    Closed on: 2002-08-08 08:56:46
Description:
Jeff,

here's a patch (just one file changed) which will 
make 'file copy' operate on files instead of links.  
With this patch incorporated, one test (fCmd-
28.15) needs modifying as well.  All other tests 
should pass.
User Comments: hobbs added on 2002-09-03 01:39:53:
Logged In: YES 
user_id=72656

This has been postponed for beyond 8.4, until it can be
further discussed.  It's likely better to try it as a file
copy option, or perhaps just as a tcllib function, due to
all the funky cases that could be hit.

nobody added on 2002-08-13 20:16:18:
Logged In: NO 

This code should do it:

    Tcl_Obj *path = Tcl_FSLink(actualSource, NULL, 0);
    if (path == NULL) {
break;
    }
    /* 
     * Now we want to check if this is a relative path,
     * and if so, to make it absolute
     */
    if (Tcl_FSGetPathType(path) == TCL_PATH_RELATIVE) {
Tcl_Obj *abs = Tcl_FSJoinToPath
(actualSource, 1, &path);
if (abs == NULL) break;
Tcl_IncrRefCount(abs);
Tcl_DecrRefCount(path);
path = abs;
    }
    Tcl_DecrRefCount(actualSource);
    actualSource = path;
    counter++;

hobbs added on 2002-08-08 17:40:32:
Logged In: YES 
user_id=72656

this looks like it will have lots of little problems like this ... I'm 
backing out the functionality for now, leaving the code #if 0'd 
out.  The more I think about it, the more it actually seems 
reasonable what Tcl was doing ... otherwise it seems like we 
have to provide all sorts of options to enable the old behavior 
for those that might have wanted it.

hemanglavana added on 2002-08-08 16:53:38:
Logged In: YES 
user_id=81875

Here's a corner case which results in error when <srcfile>
is a softlink and file copy is invoked from another
directory:

godel:43> ls -lR
.:
total 16
drwxr-xr-x   2 hlavana  eng          141 Aug  8 05:47 test

./test:
total 16
lrwxrwxrwx   1 hlavana  eng            3 Aug  8 05:47 bar -> foo
-rw-r--r--   1 hlavana  eng            0 Aug  8 05:46 foo
godel:44> /tmp/hlavana/tcltk/bin/tclsh8.4 
% file copy test/bar xxx
error copying "test/bar" to "xxx": no such file or directory
% cd test
% file copy bar ../xxx
% exit
godel:45> ls -l
total 16
drwxr-xr-x   2 hlavana  eng          141 Aug  8 05:47 test
-rw-r--r--   1 hlavana  eng            0 Aug  8 05:46 xxx
godel:46> 

Thus, softlinks pointing to relative paths need to converted
into absolute paths first before invoking the real file copy.

hobbs added on 2002-08-08 15:56:36:
Logged In: YES 
user_id=72656

had to update several more tests, but it is working now for 
8.4b2.

vincentdarley added on 2002-08-06 23:51:19:

File Added - 28539: tclFCmd.diff

Attachments: