Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | Introduce constants for internal permissions (executable/symlink). |
|---|---|
| Downloads: | Tarball | ZIP archive |
| Timelines: | family | ancestors | descendants | both | symlinks |
| Files: | files | file ages | folders |
| SHA1: |
f6daee3e7be36e7b435b116941ae3d9c |
| User & Date: | dmitry 2011-08-25 11:42:11.739 |
Context
|
2011-08-25
| ||
| 13:48 | Fix one more use of number instead of constant for permissions. check-in: 35de2bdd07 user: dmitry tags: symlinks | |
| 11:42 | Introduce constants for internal permissions (executable/symlink). check-in: f6daee3e7b user: dmitry tags: symlinks | |
|
2011-08-24
| ||
| 20:01 | Support symlinks in tarballs. check-in: 72e3bbd071 user: dmitry tags: symlinks | |
Changes
Changes to src/export.c.
| ︙ | ︙ | |||
269 270 271 272 273 274 275 |
const char *zName = db_column_text(&q4,0);
int zNew = db_column_int(&q4,1);
int mPerm = db_column_int(&q4,2);
if( zNew==0)
printf("D %s\n", zName);
else if( bag_find(&blobs, zNew) ) {
const char *zPerm;
| | | < | < | > | 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 |
const char *zName = db_column_text(&q4,0);
int zNew = db_column_int(&q4,1);
int mPerm = db_column_int(&q4,2);
if( zNew==0)
printf("D %s\n", zName);
else if( bag_find(&blobs, zNew) ) {
const char *zPerm;
switch( mPerm ){
case PERM_LNK: zPerm = "120000"; break;
case PERM_EXE: zPerm = "100755"; break;
default: zPerm = "100644"; break;
}
printf("M %s :%d %s\n", zPerm, BLOBMARK(zNew), zName);
}
}
db_finalize(&q4);
db_finalize(&q3);
printf("\n");
}
|
| ︙ | ︙ |
Changes to src/file.c.
| ︙ | ︙ | |||
197 198 199 200 201 202 203 | #else return ((S_IXUSR|S_IXGRP|S_IXOTH)&fileStat.st_mode)!=0; #endif } /* | | < < < | | | | | 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 |
#else
return ((S_IXUSR|S_IXGRP|S_IXOTH)&fileStat.st_mode)!=0;
#endif
}
/*
** Return file "permissions" (normal, executable, or symlink).
*/
int file_perm(const char *zFilename){
/*TODO(dchest): optimize by calling stat once.*/
if( file_isexe(zFilename) )
return PERM_EXE;
if( file_islink(zFilename) )
return PERM_LNK;
return PERM_REG;
}
/*
** Return 1 if zFilename is a directory. Return 0 if zFilename
** does not exist. Return 2 if zFilename exists but is something
** other than a directory.
*/
|
| ︙ | ︙ |
Changes to src/manifest.c.
| ︙ | ︙ | |||
33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
#define CFTYPE_CLUSTER 2
#define CFTYPE_CONTROL 3
#define CFTYPE_WIKI 4
#define CFTYPE_TICKET 5
#define CFTYPE_ATTACHMENT 6
#define CFTYPE_EVENT 7
/*
** A single F-card within a manifest
*/
struct ManifestFile {
char *zName; /* Name of a file */
char *zUuid; /* UUID of the file */
char *zPerm; /* File permissions */
| > > > > > > > | 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
#define CFTYPE_CLUSTER 2
#define CFTYPE_CONTROL 3
#define CFTYPE_WIKI 4
#define CFTYPE_TICKET 5
#define CFTYPE_ATTACHMENT 6
#define CFTYPE_EVENT 7
/*
** File permissions used by Fossil internally.
*/
#define PERM_REG 0 /* regular file */
#define PERM_EXE 1 /* executable */
#define PERM_LNK 2 /* symlink */
/*
** A single F-card within a manifest
*/
struct ManifestFile {
char *zName; /* Name of a file */
char *zUuid; /* UUID of the file */
char *zPerm; /* File permissions */
|
| ︙ | ︙ | |||
1083 1084 1085 1086 1087 1088 1089 |
}
/*
** Compute an appropriate mlink.mperm integer for the permission string
** of a file.
*/
int manifest_file_mperm(ManifestFile *pFile){
| | | | | 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 |
}
/*
** Compute an appropriate mlink.mperm integer for the permission string
** of a file.
*/
int manifest_file_mperm(ManifestFile *pFile){
int mperm = PERM_REG;
if( pFile && pFile->zPerm){
if( strstr(pFile->zPerm,"x")!=0 )
mperm = PERM_EXE;
else if( strstr(pFile->zPerm,"l")!=0 )
mperm = PERM_LNK;
}
return mperm;
}
/*
** Add a single entry to the mlink table. Also add the filename to
** the filename table if it is not there already.
|
| ︙ | ︙ |
Changes to src/tar.c.
| ︙ | ︙ | |||
376 377 378 379 380 381 382 | /* * If we have a symlink, write its destination path (which is stored in * pContent) into header, and set content length to 0 to avoid storing path * as file content in the next step. Since 'linkname' header is limited to * 100 bytes (-1 byte for terminating zero), if path is greater than that, * store symlink as a plain-text file. (Not sure how TAR handles long links.) */ | | | > | 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 |
/*
* If we have a symlink, write its destination path (which is stored in
* pContent) into header, and set content length to 0 to avoid storing path
* as file content in the next step. Since 'linkname' header is limited to
* 100 bytes (-1 byte for terminating zero), if path is greater than that,
* store symlink as a plain-text file. (Not sure how TAR handles long links.)
*/
if( mPerm == PERM_LNK && n <= 100 ){
sqlite3_snprintf(100, (char*)&tball.aHdr[157], "%s", blob_str(pContent));
cType = '2';
n = 0;
}
tar_add_header(zName, nName, ( mPerm==PERM_EXE ) ? 0755 : 0644,
mTime, n, cType);
if( n ){
gzip_step(blob_buffer(pContent), n);
lastPage = n % 512;
if( lastPage!=0 ){
gzip_step(tball.zSpaces, 512 - lastPage);
}
}
|
| ︙ | ︙ |
Changes to src/update.c.
| ︙ | ︙ | |||
566 567 568 569 570 571 572 |
}
pManifest = manifest_get(rid, CFTYPE_MANIFEST);
if( pManifest ){
pFile = manifest_file_seek(pManifest, file);
if( pFile ){
rid = uuid_to_rid(pFile->zUuid, 0);
| | | | 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 |
}
pManifest = manifest_get(rid, CFTYPE_MANIFEST);
if( pManifest ){
pFile = manifest_file_seek(pManifest, file);
if( pFile ){
rid = uuid_to_rid(pFile->zUuid, 0);
if( pIsExe ) *pIsExe = ( manifest_file_mperm(pFile)==PERM_EXE );
if( pIsLink ) *pIsLink = ( manifest_file_mperm(pFile)==PERM_LNK );
manifest_destroy(pManifest);
return content_get(rid, content);
}
manifest_destroy(pManifest);
if( errCode<=0 ){
fossil_fatal("file %s does not exist in checkin: %s", file, revision);
}
|
| ︙ | ︙ |
Changes to src/vfile.c.
| ︙ | ︙ | |||
108 109 110 111 112 113 114 |
size = 0;
}
db_reset(&ridq);
if( rid==0 || size<0 ){
fossil_warning("content missing for %s", pFile->zName);
continue;
}
| | | | 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
size = 0;
}
db_reset(&ridq);
if( rid==0 || size<0 ){
fossil_warning("content missing for %s", pFile->zName);
continue;
}
db_bind_int(&ins, ":isexe", ( manifest_file_mperm(pFile)==PERM_EXE ));
db_bind_int(&ins, ":id", rid);
db_bind_text(&ins, ":name", pFile->zName);
db_bind_int(&ins, ":islink", ( manifest_file_mperm(pFile)==PERM_LNK ));
db_step(&ins);
db_reset(&ins);
}
db_finalize(&ridq);
db_finalize(&ins);
manifest_destroy(p);
db_end_transaction(0);
|
| ︙ | ︙ |
Changes to src/zip.c.
| ︙ | ︙ | |||
137 138 139 140 141 142 143 |
char zOutBuf[100000];
/* Fill in as much of the header as we know.
*/
nBlob = pFile ? blob_size(pFile) : 0;
if( nBlob>0 ){
iMethod = 8;
| | | < | < | > | 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 |
char zOutBuf[100000];
/* Fill in as much of the header as we know.
*/
nBlob = pFile ? blob_size(pFile) : 0;
if( nBlob>0 ){
iMethod = 8;
switch( mPerm ){
case PERM_LNK: iMode = 0120755; break;
case PERM_EXE: iMode = 0100755; break;
default: iMode = 0100644; break;
}
}else{
iMethod = 0;
iMode = 040755;
}
nameLen = strlen(zName);
memset(zHdr, 0, sizeof(zHdr));
put32(&zHdr[0], 0x04034b50);
|
| ︙ | ︙ |