Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | Bug fix in the "mv" command. Add filename change tracking to the check-in information screens. <b>You must run <i>rebuild</i> on existing respositories when upgrading to this version of fossil.</b> |
|---|---|
| Downloads: | Tarball | ZIP archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA1: |
9fd80090073cc5e781c07d5debab7a3a |
| User & Date: | drh 2008-11-09 22:43:04.000 |
References
|
2008-11-15
| ||
| 06:44 | • New ticket [4f6b211d6b] some new wikis not visible as wiki. ... (artifact: fa1291780f user: anonymous) | |
Context
|
2008-11-09
| ||
| 22:50 | On the index page, links to the "two separate servers" go to the index pages on those servers, not to the timeline. ... (check-in: ec53d7a738 user: drh tags: trunk) | |
| 22:43 | Bug fix in the "mv" command. Add filename change tracking to the check-in information screens. <b>You must run <i>rebuild</i> on existing respositories when upgrading to this version of fossil.</b> ... (check-in: 9fd8009007 user: drh tags: trunk) | |
| 19:30 | Optional extra arguments to the "user" command allow one to specify the new password or contact information on the command-line without waiting for a prompt. This makes the "user" command usable from shell-scripts. ... (check-in: f6c0201af7 user: drh tags: trunk) | |
Changes
Changes to src/add.c.
| ︙ | ︙ | |||
192 193 194 195 196 197 198 199 200 201 202 203 204 205 |
usage("OLDNAME NEWNAME");
}
file_tree_name(g.argv[2], &orig, 1);
db_multi_exec(
"INSERT INTO mv VALUES(%B,%B)", &orig, &dest
);
}else{
for(i=2; i<g.argc-1; i++){
Blob orig;
char *zOrig;
int nOrig;
file_tree_name(g.argv[i], &orig, 1);
zOrig = blob_str(&orig);
nOrig = blob_size(&orig);
| > > > > > | 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 |
usage("OLDNAME NEWNAME");
}
file_tree_name(g.argv[2], &orig, 1);
db_multi_exec(
"INSERT INTO mv VALUES(%B,%B)", &orig, &dest
);
}else{
if( blob_eq(&dest, ".") ){
blob_reset(&dest);
}else{
blob_append(&dest, "/", 1);
}
for(i=2; i<g.argc-1; i++){
Blob orig;
char *zOrig;
int nOrig;
file_tree_name(g.argv[i], &orig, 1);
zOrig = blob_str(&orig);
nOrig = blob_size(&orig);
|
| ︙ | ︙ | |||
216 217 218 219 220 221 222 |
const char *zTail;
if( nPath==nOrig ){
zTail = file_tail(zPath);
}else{
zTail = &zPath[nOrig+1];
}
db_multi_exec(
| | | 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 |
const char *zTail;
if( nPath==nOrig ){
zTail = file_tail(zPath);
}else{
zTail = &zPath[nOrig+1];
}
db_multi_exec(
"INSERT INTO mv VALUES('%s','%s%s')",
zPath, blob_str(&dest), zTail
);
}
db_finalize(&q);
}
}
db_prepare(&q, "SELECT f, t FROM mv ORDER BY f");
|
| ︙ | ︙ |
Changes to src/info.c.
| ︙ | ︙ | |||
392 393 394 395 396 397 398 |
@ </table></p>
}else{
style_header("Baseline Information");
login_anonymous_available();
}
db_finalize(&q);
showTags(rid, "");
| | > > > > > > > > > > > > > > > > > > > > | > < | | | | | 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 |
@ </table></p>
}else{
style_header("Baseline Information");
login_anonymous_available();
}
db_finalize(&q);
showTags(rid, "");
@ <div class="section">File Changes</div>
@ <ul>
db_prepare(&q,
"SELECT a.name, b.name"
" FROM mlink, filename AS a, filename AS b"
" WHERE mid=%d"
" AND a.fnid=mlink.fnid"
" AND b.fnid=mlink.pfnid",
rid
);
while( db_step(&q)==SQLITE_ROW ){
const char *zName = db_column_text(&q, 0);
const char *zPrior = db_column_text(&q, 1);
@ <li><b>Renamed:</b>
if( g.okHistory ){
@ <a href="%s(g.zBaseURL)/finfo?name=%T(zName)">%h(zPrior)</a> to
@ <a href="%s(g.zBaseURL)/finfo?name=%T(zName)">%h(zName)</a></li>
}else{
@ %h(zPrior) to %h(zName)</li>
}
}
db_finalize(&q);
db_prepare(&q,
"SELECT name, pid, fid "
" FROM mlink, filename"
" WHERE mid=%d"
" AND fid!=pid"
" AND filename.fnid=mlink.fnid",
rid
);
while( db_step(&q)==SQLITE_ROW ){
const char *zName = db_column_text(&q, 0);
int pid = db_column_int(&q, 1);
int fid = db_column_int(&q, 2);
if( pid && fid ){
@ <li><b>Modified:</b>
}else if( fid ){
@ <li><b>Added:</b>
}else if( pid ){
@ <li><b>Deleted:</b>
}
if( g.okHistory ){
@ <a href="%s(g.zBaseURL)/finfo?name=%T(zName)">%h(zName)</a></li>
}else{
@ %h(zName)</li>
}
}
|
| ︙ | ︙ |
Changes to src/manifest.c.
| ︙ | ︙ | |||
63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
char *zTicketUuid; /* UUID for a ticket */
int nFile; /* Number of F lines */
int nFileAlloc; /* Slots allocated in aFile[] */
struct {
char *zName; /* Name of a file */
char *zUuid; /* UUID of the file */
char *zPerm; /* File permissions */
} *aFile;
int nParent; /* Number of parents */
int nParentAlloc; /* Slots allocated in azParent[] */
char **azParent; /* UUIDs of parents */
int nCChild; /* Number of cluster children */
int nCChildAlloc; /* Number of closts allocated in azCChild[] */
char **azCChild; /* UUIDs of referenced objects in a cluster */
| > > | 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
char *zTicketUuid; /* UUID for a ticket */
int nFile; /* Number of F lines */
int nFileAlloc; /* Slots allocated in aFile[] */
struct {
char *zName; /* Name of a file */
char *zUuid; /* UUID of the file */
char *zPerm; /* File permissions */
char *zPrior; /* Prior name if the name was changed */
int iRename; /* index of renamed name in prior/next manifest */
} *aFile;
int nParent; /* Number of parents */
int nParentAlloc; /* Slots allocated in azParent[] */
char **azParent; /* UUIDs of parents */
int nCChild; /* Number of cluster children */
int nCChildAlloc; /* Number of closts allocated in azCChild[] */
char **azCChild; /* UUIDs of referenced objects in a cluster */
|
| ︙ | ︙ | |||
298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 |
blob_token(&line, &a4);
zPriorName = blob_terminate(&a4);
if( zPriorName[0] ){
defossilize(zPriorName);
if( !file_is_simple_pathname(zPriorName) ){
goto manifest_syntax_error;
}
}
if( p->nFile>=p->nFileAlloc ){
p->nFileAlloc = p->nFileAlloc*2 + 10;
p->aFile = realloc(p->aFile, p->nFileAlloc*sizeof(p->aFile[0]) );
if( p->aFile==0 ) fossil_panic("out of memory");
}
i = p->nFile++;
p->aFile[i].zName = zName;
p->aFile[i].zUuid = zUuid;
p->aFile[i].zPerm = zPerm;
if( i>0 && strcmp(p->aFile[i-1].zName, zName)>=0 ){
goto manifest_syntax_error;
}
break;
}
/*
| > > > > | 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 |
blob_token(&line, &a4);
zPriorName = blob_terminate(&a4);
if( zPriorName[0] ){
defossilize(zPriorName);
if( !file_is_simple_pathname(zPriorName) ){
goto manifest_syntax_error;
}
}else{
zPriorName = 0;
}
if( p->nFile>=p->nFileAlloc ){
p->nFileAlloc = p->nFileAlloc*2 + 10;
p->aFile = realloc(p->aFile, p->nFileAlloc*sizeof(p->aFile[0]) );
if( p->aFile==0 ) fossil_panic("out of memory");
}
i = p->nFile++;
p->aFile[i].zName = zName;
p->aFile[i].zUuid = zUuid;
p->aFile[i].zPerm = zPerm;
p->aFile[i].zPrior = zPriorName;
p->aFile[i].iRename = -1;
if( i>0 && strcmp(p->aFile[i-1].zName, zName)>=0 ){
goto manifest_syntax_error;
}
break;
}
/*
|
| ︙ | ︙ | |||
699 700 701 702 703 704 705 | ** Add a single entry to the mlink table. Also add the filename to ** the filename table if it is not there already. */ static void add_one_mlink( int mid, /* The record ID of the manifest */ const char *zFromUuid, /* UUID for the mlink.pid field */ const char *zToUuid, /* UUID for the mlink.fid field */ | | > | > > > > > > > > > | | > > > > > > > > > > > > > > > > > > > > > > > > > > | > > | | | 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 |
** Add a single entry to the mlink table. Also add the filename to
** the filename table if it is not there already.
*/
static void add_one_mlink(
int mid, /* The record ID of the manifest */
const char *zFromUuid, /* UUID for the mlink.pid field */
const char *zToUuid, /* UUID for the mlink.fid field */
const char *zFilename, /* Filename */
const char *zPrior /* Previous filename. NULL if unchanged */
){
int fnid, pfnid, pid, fid;
fnid = db_int(0, "SELECT fnid FROM filename WHERE name=%Q", zFilename);
if( fnid==0 ){
db_multi_exec("INSERT INTO filename(name) VALUES(%Q)", zFilename);
fnid = db_last_insert_rowid();
}
if( zPrior==0 ){
pfnid = 0;
}else{
pfnid = db_int(0, "SELECT fnid FROM filename WHERE name=%Q", zPrior);
if( pfnid==0 ){
db_multi_exec("INSERT INTO filename(name) VALUES(%Q)", zPrior);
pfnid = db_last_insert_rowid();
}
}
if( zFromUuid==0 ){
pid = 0;
}else{
pid = uuid_to_rid(zFromUuid, 1);
}
if( zToUuid==0 ){
fid = 0;
}else{
fid = uuid_to_rid(zToUuid, 1);
}
db_multi_exec(
"INSERT INTO mlink(mid,pid,fid,fnid,pfnid)"
"VALUES(%d,%d,%d,%d,%d)", mid, pid, fid, fnid, pfnid
);
if( pid && fid ){
content_deltify(pid, fid, 0);
}
}
/*
** Locate a file named zName in the aFile[] array of the given
** manifest. We assume that filenames are in sorted order.
** Use a binary search. Return turn the index of the matching
** entry. Or return -1 if not found.
*/
static int find_file_in_manifest(Manifest *p, const char *zName){
int lwr, upr;
int c;
int i;
lwr = 0;
upr = p->nFile - 1;
while( lwr<=upr ){
i = (lwr+upr)/2;
c = strcmp(p->aFile[i].zName, zName);
if( c<0 ){
lwr = i+1;
}else if( c>0 ){
upr = i-1;
}else{
return i;
}
}
return -1;
}
/*
** Add mlink table entries associated with manifest cid. The
** parent manifest is pid.
**
** A single mlink entry is added for every file that changed content
** and/or name going from pid to cid.
**
** Deleted files have mlink.fid=0.
** Added files have mlink.pid=0.
** Edited files have both mlink.pid!=0 and mlink.fid!=0
*/
static void add_mlink(int pid, Manifest *pParent, int cid, Manifest *pChild){
Manifest other;
|
| ︙ | ︙ | |||
755 756 757 758 759 760 761 762 |
}else{
pChild = &other;
content_get(cid, &otherContent);
}
if( blob_size(&otherContent)==0 ) return;
if( manifest_parse(&other, &otherContent)==0 ) return;
content_deltify(pid, cid, 0);
for(i=j=0; i<pParent->nFile && j<pChild->nFile; ){
| > > > > > > > > > > > > > > > > > > | < | > > > > > | > | | > | > > > > > > | > | 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 |
}else{
pChild = &other;
content_get(cid, &otherContent);
}
if( blob_size(&otherContent)==0 ) return;
if( manifest_parse(&other, &otherContent)==0 ) return;
content_deltify(pid, cid, 0);
/* Use the iRename fields to find the cross-linkage between
** renamed files. */
for(j=0; j<pChild->nFile; j++){
const char *zPrior = pChild->aFile[j].zPrior;
if( zPrior && zPrior[0] ){
i = find_file_in_manifest(pParent, zPrior);
if( i>=0 ){
pChild->aFile[j].iRename = i;
pParent->aFile[i].iRename = j;
}
}
}
/* Construct the mlink entries */
for(i=j=0; i<pParent->nFile && j<pChild->nFile; ){
int c;
if( pParent->aFile[i].iRename>=0 ){
i++;
}else if( (c = strcmp(pParent->aFile[i].zName, pChild->aFile[j].zName))<0 ){
add_one_mlink(cid, pParent->aFile[i].zUuid,0,pParent->aFile[i].zName,0);
i++;
}else if( c>0 ){
int rn = pChild->aFile[j].iRename;
if( rn>=0 ){
add_one_mlink(cid, pParent->aFile[rn].zUuid, pChild->aFile[j].zUuid,
pChild->aFile[j].zName, pParent->aFile[rn].zName);
}else{
add_one_mlink(cid, 0, pChild->aFile[j].zUuid, pChild->aFile[j].zName,0);
}
j++;
}else{
if( strcmp(pParent->aFile[i].zUuid, pChild->aFile[j].zUuid)!=0 ){
add_one_mlink(cid, pParent->aFile[i].zUuid, pChild->aFile[j].zUuid,
pChild->aFile[j].zName, 0);
}
i++;
j++;
}
}
while( i<pParent->nFile ){
if( pParent->aFile[i].iRename<0 ){
add_one_mlink(cid, pParent->aFile[i].zUuid, 0, pParent->aFile[i].zName,0);
}
i++;
}
while( j<pChild->nFile ){
int rn = pChild->aFile[j].iRename;
if( rn>=0 ){
add_one_mlink(cid, pParent->aFile[rn].zUuid, pChild->aFile[j].zUuid,
pChild->aFile[j].zName, pParent->aFile[rn].zName);
}else{
add_one_mlink(cid, 0, pChild->aFile[j].zUuid, pChild->aFile[j].zName,0);
}
j++;
}
manifest_clear(&other);
}
/*
** Scan artifact rid/pContent to see if it is a control artifact of
|
| ︙ | ︙ |
Changes to src/schema.c.
| ︙ | ︙ | |||
176 177 178 179 180 181 182 | @ -- pid==0 if the file is added by check-in mid. @ -- fid==0 if the file is removed by check-in mid. @ -- @ CREATE TABLE mlink( @ mid INTEGER REFERENCES blob, -- Manifest ID where change occurs @ pid INTEGER REFERENCES blob, -- File ID in parent manifest @ fid INTEGER REFERENCES blob, -- Changed file ID in this manifest | | > | 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 | @ -- pid==0 if the file is added by check-in mid. @ -- fid==0 if the file is removed by check-in mid. @ -- @ CREATE TABLE mlink( @ mid INTEGER REFERENCES blob, -- Manifest ID where change occurs @ pid INTEGER REFERENCES blob, -- File ID in parent manifest @ fid INTEGER REFERENCES blob, -- Changed file ID in this manifest @ fnid INTEGER REFERENCES filename, -- Name of the file @ pfnid INTEGER REFERENCES filename -- Previous name. 0 if unchanged @ ); @ CREATE INDEX mlink_i1 ON mlink(mid); @ CREATE INDEX mlink_i2 ON mlink(fnid); @ CREATE INDEX mlink_i3 ON mlink(fid); @ CREATE INDEX mlink_i4 ON mlink(pid); @ @ -- Parent/child linkages |
| ︙ | ︙ |