Changes On Branch file-safety
Not logged in

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Changes In Branch file-safety Excluding Merge-Ins

This is equivalent to a diff from e7b6434112 to a1814d5015

2011-02-16
15:00
Work around the seemingly buggy behavior of git-fast-export with regard to tags when doing an import. check-in: 496aacd10e user: drh tags: trunk
2011-02-15
07:47
add custom Makefile with changes to support OpenSSL build on Windows check-in: 5567c81285 user: mistachkin tags: trunk
05:18
Create new branch named "bch" check-in: 8b5556c9fe user: bharder tags: bch
2011-02-12
13:38
This branch contains experimental changes attempting to address complaints that Fossil sometimes overwrites unmanaged files. In this checkin: Use file_delete() instead of unlink() everywhere. Add interfaces file_move() and file_dont_overwrite() but do not use those interfaces yet. Leaf check-in: a1814d5015 user: drh tags: file-safety
2011-02-11
20:53
Add the --detail option to the test-timewarp-list command. check-in: e7b6434112 user: drh tags: trunk
20:09
Make sure the EVENT.OMTIME value is recorded correctly when parsing a check-in manifest. check-in: 1d83ecc5d5 user: drh tags: trunk

Changes to src/checkin.c.

   349    349         g.zLocalRoot, fossil_all_reserved_names(), glob_expr("x",zIgnoreFlag)
   350    350     );
   351    351     if( file_tree_name(g.zRepositoryName, &repo, 0) ){
   352    352       db_multi_exec("DELETE FROM sfile WHERE x=%B", &repo);
   353    353     }
   354    354     while( db_step(&q)==SQLITE_ROW ){
   355    355       if( allFlag ){
   356         -      unlink(db_column_text(&q, 0));
          356  +      file_delete(db_column_text(&q, 0));
   357    357       }else{
   358    358         Blob ans;
   359    359         char *prompt = mprintf("remove unmanaged file \"%s\" (y/N)? ",
   360    360                                 db_column_text(&q, 0));
   361    361         blob_zero(&ans);
   362    362         prompt_user(prompt, &ans);
   363    363         if( blob_str(&ans)[0]=='y' ){
   364         -        unlink(db_column_text(&q, 0));
          364  +        file_delete(db_column_text(&q, 0));
   365    365         }
   366    366       }
   367    367     }
   368    368     db_finalize(&q);
   369    369   }
   370    370   
   371    371   /*
................................................................................
   456    456       blob_reset(&text);
   457    457       while( fgets(zIn, sizeof(zIn), stdin)!=0 ){
   458    458         if( zIn[0]=='.' && (zIn[1]==0 || zIn[1]=='\r' || zIn[1]=='\n') ) break;
   459    459         blob_append(&text, zIn, -1);
   460    460       }
   461    461     }
   462    462     blob_remove_cr(&text);
   463         -  unlink(zFile);
          463  +  file_delete(zFile);
   464    464     free(zFile);
   465    465     blob_zero(pComment);
   466    466     while( blob_line(&text, &line) ){
   467    467       int i, n;
   468    468       char *z;
   469    469       n = blob_size(&line);
   470    470       z = blob_buffer(&line);

Changes to src/checkout.c.

   155    155       blob_append(&hash, "\n", 1);
   156    156       blob_write_to_file(&hash, zManFile);
   157    157       free(zManFile);
   158    158       blob_reset(&hash);
   159    159     }else{
   160    160       if( !db_exists("SELECT 1 FROM vfile WHERE pathname='manifest'") ){
   161    161         zManFile = mprintf("%smanifest", g.zLocalRoot);
   162         -      unlink(zManFile);
          162  +      file_delete(zManFile);
   163    163         free(zManFile);
   164    164       }
   165    165       if( !db_exists("SELECT 1 FROM vfile WHERE pathname='manifest.uuid'") ){
   166    166         zManFile = mprintf("%smanifest.uuid", g.zLocalRoot);
   167         -      unlink(zManFile);
          167  +      file_delete(zManFile);
   168    168         free(zManFile);
   169    169       }
   170    170     }
   171    171       
   172    172   }
   173    173   
   174    174   /*
................................................................................
   266    266   static void unlink_local_database(int manifestOnly){
   267    267     const char *zReserved;
   268    268     int i;
   269    269     for(i=0; (zReserved = fossil_reserved_name(i))!=0; i++){
   270    270       if( manifestOnly==0 || zReserved[0]=='m' ){
   271    271         char *z;
   272    272         z = mprintf("%s%s", g.zLocalRoot, zReserved);
   273         -      unlink(z);
          273  +      file_delete(z);
   274    274         free(z);
   275    275       }
   276    276     }
   277    277   }
   278    278   
   279    279   /*
   280    280   ** COMMAND: close

Changes to src/clearsign.c.

    50     50       blob_zero(pOut);
    51     51       blob_read_from_file(pOut, zIn);
    52     52     }else{
    53     53       if( pOut!=pIn ){
    54     54         blob_copy(pOut, pIn);
    55     55       }
    56     56     }
    57         -  unlink(zOut);
    58         -  unlink(zIn);
           57  +  file_delete(zOut);
           58  +  file_delete(zIn);
    59     59     free(zOut);
    60     60     free(zIn);
    61     61     return rc;
    62     62   }

Changes to src/clone.c.

    98     98       g.xlinkClusterOnly = 1;
    99     99       nErr = client_sync(0,0,1,CONFIGSET_ALL,0);
   100    100       g.xlinkClusterOnly = 0;
   101    101       verify_cancel();
   102    102       db_end_transaction(0);
   103    103       db_close(1);
   104    104       if( nErr ){
   105         -      unlink(g.argv[3]);
          105  +      file_delete(g.argv[3]);
   106    106         fossil_fatal("server returned an error - clone aborted");
   107    107       }
   108    108       db_open_repository(g.argv[3]);
   109    109     }
   110    110     db_begin_transaction();
   111    111     printf("Rebuilding repository meta-data...\n");
   112    112     rebuild_db(0, 1, 0);
   113    113     printf("project-id: %s\n", db_get("project-code", 0));
   114    114     printf("server-id:  %s\n", db_get("server-code", 0));
   115    115     zPassword = db_text(0, "SELECT pw FROM user WHERE login=%Q", g.zLogin);
   116    116     printf("admin-user: %s (password is \"%s\")\n", g.zLogin, zPassword);
   117    117     db_end_transaction(0);
   118    118   }

Changes to src/db.c.

   149    149       db_finalize(pAllStmt);
   150    150     }
   151    151     if( nBegin ){
   152    152       sqlite3_exec(g.db, "ROLLBACK", 0, 0, 0);
   153    153       nBegin = 0;
   154    154       if( isNewRepo ){
   155    155         db_close(0);
   156         -      unlink(g.zRepositoryName);
          156  +      file_delete(g.zRepositoryName);
   157    157       }
   158    158     }
   159    159     busy = 0;
   160    160     db_close(0);
   161    161   }
   162    162   
   163    163   /*

Changes to src/diffcmd.c.

    97     97       blob_append(&cmd, " ", 1);
    98     98       shell_escape(&cmd, zFile2);
    99     99   
   100    100       /* Run the external diff command */
   101    101       fossil_system(blob_str(&cmd));
   102    102   
   103    103       /* Delete the temporary file and clean up memory used */
   104         -    unlink(blob_str(&nameFile1));
          104  +    file_delete(blob_str(&nameFile1));
   105    105       blob_reset(&nameFile1);
   106    106       blob_reset(&cmd);
   107    107     }
   108    108   }
   109    109   
   110    110   /*
   111    111   ** Show the difference between two files, both in memory.
................................................................................
   151    151       blob_append(&cmd, " ", 1);
   152    152       shell_escape(&cmd, zTemp2);
   153    153   
   154    154       /* Run the external diff command */
   155    155       fossil_system(blob_str(&cmd));
   156    156   
   157    157       /* Delete the temporary file and clean up memory used */
   158         -    unlink(zTemp1);
   159         -    unlink(zTemp2);
          158  +    file_delete(zTemp1);
          159  +    file_delete(zTemp2);
   160    160       blob_reset(&cmd);
   161    161     }
   162    162   }
   163    163   
   164    164   /*
   165    165   ** Do a diff against a single file named in g.argv[2] from version zFrom
   166    166   ** against the same file on disk.

Changes to src/file.c.

   131    131     const char *zTail = z;
   132    132     while( z[0] ){
   133    133       if( z[0]=='/' ) zTail = &z[1];
   134    134       z++;
   135    135     }
   136    136     return zTail;
   137    137   }
          138  +
          139  +/*
          140  +** Delete a file.
          141  +*/
          142  +void file_delete(const char *zFilename){
          143  +  unlink(zFilename);
          144  +}
   138    145   
   139    146   /*
   140    147   ** Copy the content of a file from one place to another.
   141    148   */
   142    149   void file_copy(const char *zFrom, const char *zTo){
   143    150     FILE *in, *out;
   144    151     int got;
................................................................................
   149    156     if( out==0 ) fossil_fatal("cannot open \"%s\" for writing", zTo);
   150    157     while( (got=fread(zBuf, 1, sizeof(zBuf), in))>0 ){
   151    158       fwrite(zBuf, 1, got, out);
   152    159     }
   153    160     fclose(in);
   154    161     fclose(out);
   155    162   }
          163  +
          164  +/*
          165  +** Rename a file.
          166  +*/
          167  +void file_move(const char *zFrom, const char *zTo){
          168  +#if defined(_WIN32)
          169  +  /* if( MoveFileW(zFrom, zTo) ) return; */
          170  +#else
          171  +  if( rename(zFrom, zTo)==0 ) return;
          172  +#endif
          173  +  file_copy(zFrom, zTo);
          174  +  file_delete(zFrom);
          175  +}
          176  +
          177  +/*
          178  +** If the named file exists, move it out of the way so that it will not
          179  +** be overwritten by subsequent operations.
          180  +*/
          181  +void file_dont_overwrite(const char *z){
          182  +  char *zNow;
          183  +  char *zNewName;
          184  +  int cnt = 0;
          185  +  if( file_mtime(z)<0 ) return;
          186  +  if( !file_isfile(0) ){
          187  +    fossil_fatal("cannot overwrite \"%s\"  - not an ordinary file");
          188  +  }
          189  +  zNow = db_text(0, "SELECT strftime('%%Y%%m%%d%%H%%M%%S', 'now')");
          190  +  while(1){
          191  +    zNewName = mprintf("%s-%s-%d", z, zNow, cnt++);
          192  +    if( file_mtime(zNewName)<0 ) break;
          193  +    fossil_free(zNewName);
          194  +  }
          195  +  fossil_free(zNow);
          196  +  file_move(z, zNewName);
          197  +  fossil_free(zNewName);
          198  +}
   156    199   
   157    200   /*
   158    201   ** Set or clear the execute bit on a file.
   159    202   */
   160    203   void file_setexe(const char *zFilename, int onoff){
   161    204   #if !defined(_WIN32)
   162    205     struct stat buf;
................................................................................
   180    223   **
   181    224   ** Return the number of errors.
   182    225   */
   183    226   int file_mkdir(const char *zName, int forceFlag){
   184    227     int rc = file_isdir(zName);
   185    228     if( rc==2 ){
   186    229       if( !forceFlag ) return 1;
   187         -    unlink(zName);
          230  +    file_delete(zName);
   188    231     }
   189    232     if( rc!=1 ){
   190    233   #if defined(_WIN32)
   191    234       return mkdir(zName);
   192    235   #else
   193    236       return mkdir(zName, 0755);
   194    237   #endif

Changes to src/http_transport.c.

   240    240         ssl_close();
   241    241         #endif
   242    242       }else if( g.urlIsFile ){
   243    243         if( transport.pFile ){ 
   244    244           fclose(transport.pFile);
   245    245           transport.pFile = 0;
   246    246         }
   247         -      unlink(transport.zInFile);
   248         -      unlink(transport.zOutFile);
          247  +      file_delete(transport.zInFile);
          248  +      file_delete(transport.zOutFile);
   249    249         free(transport.zInFile);
   250    250         free(transport.zOutFile);
   251    251       }else{
   252    252         socket_close();
   253    253       }
   254    254       transport.isOpen = 0;
   255    255     }

Changes to src/import.c.

   641    641     }
   642    642     if( g.argc==4 ){
   643    643       pIn = fopen(g.argv[3], "rb");
   644    644     }else{
   645    645       pIn = stdin;
   646    646       fossil_binary_mode(pIn);
   647    647     }
   648         -  if( forceFlag ) unlink(g.argv[2]);
          648  +  if( forceFlag ) file_delete(g.argv[2]);
   649    649     db_create_repository(g.argv[2]);
   650    650     db_open_repository(g.argv[2]);
   651    651     db_open_config(0);
   652    652     db_multi_exec(
   653    653        "CREATE TEMP TABLE xtag(tname TEXT UNIQUE, trid INT, tuuid TEXT);"
   654    654        "CREATE TEMP TABLE xbranch(tname TEXT UNIQUE, brnm TEXT);"
   655    655     );

Changes to src/merge.c.

   408    408       }
   409    409       undo_save(zName);
   410    410       db_multi_exec(
   411    411         "UPDATE vfile SET deleted=1 WHERE id=%d", idv
   412    412       );
   413    413       if( !nochangeFlag ){
   414    414         char *zFullPath = mprintf("%s%s", g.zLocalRoot, zName);
   415         -      unlink(zFullPath);
          415  +      file_delete(zFullPath);
   416    416         free(zFullPath);
   417    417       }
   418    418     }
   419    419     db_finalize(&q);
   420    420   
   421    421     /*
   422    422     ** Rename files that have taken a rename on P->M but which keep the same
................................................................................
   438    438         "UPDATE vfile SET pathname=%Q, origname=coalesce(origname,pathname)"
   439    439         " WHERE id=%d AND vid=%d", zNewName, idv, vid
   440    440       );
   441    441       if( !nochangeFlag ){
   442    442         char *zFullOldPath = mprintf("%s%s", g.zLocalRoot, zOldName);
   443    443         char *zFullNewPath = mprintf("%s%s", g.zLocalRoot, zNewName);
   444    444         file_copy(zFullOldPath, zFullNewPath);
   445         -      unlink(zFullOldPath);
          445  +      file_delete(zFullOldPath);
   446    446         free(zFullNewPath);
   447    447         free(zFullOldPath);
   448    448       }
   449    449     }
   450    450     db_finalize(&q);
   451    451   
   452    452   

Changes to src/stash.c.

   186    186       blob_zero(&delta);
   187    187       if( rid==0 ){
   188    188         db_ephemeral_blob(&q, 5, &delta);
   189    189         blob_write_to_file(&delta, zNPath);
   190    190         printf("ADD %s\n", zNew);
   191    191       }else if( isRemoved ){
   192    192         printf("DELETE %s\n", zOrig);
   193         -      unlink(zOPath);
          193  +      file_delete(zOPath);
   194    194       }else{
   195    195         Blob a, b, out, disk;
   196    196         db_ephemeral_blob(&q, 5, &delta);
   197    197         blob_read_from_file(&disk, zOPath);     
   198    198         content_get(rid, &a);
   199    199         blob_delta_apply(&a, &delta, &b);
   200    200         if( blob_compare(&disk, &a)==0 ){
................................................................................
   214    214         blob_reset(&a);
   215    215         blob_reset(&b);
   216    216         blob_reset(&disk);
   217    217       }
   218    218       blob_reset(&delta);
   219    219       if( fossil_strcmp(zOrig,zNew)!=0 ){
   220    220         undo_save(zOrig);
   221         -      unlink(zOPath);
          221  +      file_delete(zOPath);
   222    222       }
   223    223     }
   224    224     db_finalize(&q);
   225    225     if( nConflict ){
   226    226       printf("WARNING: merge conflicts - see messages above for details.\n");
   227    227     }
   228    228   }

Changes to src/undo.c.

    57     57           printf("%s %s\n", redoFlag ? "REDO" : "UNDO", zPathname);
    58     58         }else{
    59     59           printf("NEW %s\n", zPathname);
    60     60         }
    61     61         blob_write_to_file(&new, zFullname);
    62     62       }else{
    63     63         printf("DELETE %s\n", zPathname);
    64         -      unlink(zFullname);
           64  +      file_delete(zFullname);
    65     65       }
    66     66       blob_reset(&new);
    67     67       free(zFullname);
    68     68       db_finalize(&q);
    69     69       db_prepare(&q, 
    70     70          "UPDATE undo SET content=:c, existsflag=%d, redoflag=NOT redoflag"
    71     71          " WHERE pathname=%Q",

Changes to src/update.c.

   356    356           /* Edited locally but deleted from the target.  Do not track the
   357    357           ** file but keep the edited version around. */
   358    358           printf("CONFLICT %s - edited locally but deleted by update\n", zName);
   359    359           nConflict++;
   360    360         }else{
   361    361           printf("REMOVE %s\n", zName);
   362    362           undo_save(zName);
   363         -        if( !nochangeFlag ) unlink(zFullPath);
          363  +        if( !nochangeFlag ) file_delete(zFullPath);
   364    364         }
   365    365       }else if( idt>0 && idv>0 && ridt!=ridv && chnged ){
   366    366         /* Merge the changes in the current tree into the target version */
   367    367         Blob e, r, t, v;
   368    368         int rc;
   369    369         if( nameChng ){
   370    370           printf("MERGE %s -> %s\n", zName, zNewName);
................................................................................
   384    384             nConflict++;
   385    385           }
   386    386         }else{
   387    387           if( !nochangeFlag ) blob_write_to_file(&t, zFullNewPath);
   388    388           printf("***** Cannot merge binary file %s\n", zNewName);
   389    389           nConflict++;
   390    390         }
   391         -      if( nameChng && !nochangeFlag ) unlink(zFullPath);
          391  +      if( nameChng && !nochangeFlag ) file_delete(zFullPath);
   392    392         blob_reset(&v);
   393    393         blob_reset(&e);
   394    394         blob_reset(&t);
   395    395         blob_reset(&r);
   396    396       }else{
   397    397         if( chnged ){
   398    398           if( verboseFlag ) printf("EDITED %s\n", zName);

Changes to src/vfile.c.

   266    266     Stmt q;
   267    267     db_prepare(&q, "SELECT %Q || pathname FROM vfile"
   268    268                    " WHERE vid=%d AND mrid>0", g.zLocalRoot, vid);
   269    269     while( db_step(&q)==SQLITE_ROW ){
   270    270       const char *zName;
   271    271   
   272    272       zName = db_column_text(&q, 0);
   273         -    unlink(zName);
          273  +    file_delete(zName);
   274    274     }
   275    275     db_finalize(&q);
   276    276     db_multi_exec("UPDATE vfile SET mtime=NULL WHERE vid=%d AND mrid>0", vid);
   277    277   }
   278    278   
   279    279   /*
   280    280   ** Load into table SFILE the name of every ordinary file in

Changes to src/winhttp.c.

   121    121       }
   122    122     }
   123    123   
   124    124   end_request:
   125    125     if( out ) fclose(out);
   126    126     if( in ) fclose(in);
   127    127     closesocket(p->s);
   128         -  unlink(zRequestFName);
   129         -  unlink(zReplyFName);
          128  +  file_delete(zRequestFName);
          129  +  file_delete(zReplyFName);
   130    130     free(p);
   131    131   }
   132    132   
   133    133   /*
   134    134   ** Start a listening socket and process incoming HTTP requests on
   135    135   ** that socket.
   136    136   */
................................................................................
   144    144     WSADATA wd;
   145    145     SOCKET s = INVALID_SOCKET;
   146    146     SOCKADDR_IN addr;
   147    147     int idCnt = 0;
   148    148     int iPort = mnPort;
   149    149     char *zNotFoundOption;
   150    150   
   151         -  if( zStopper ) unlink(zStopper);
          151  +  if( zStopper ) file_delete(zStopper);
   152    152     if( zNotFound ){
   153    153       zNotFoundOption = mprintf(" --notfound %s", zNotFound);
   154    154     }else{
   155    155       zNotFoundOption = "";
   156    156     }
   157    157     if( WSAStartup(MAKEWORD(1,1), &wd) ){
   158    158       fossil_fatal("unable to initialize winsock");