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");