Fossil SCM

Add the --mimetype option to the "commit" command.

drh 2013-04-01 13:50 UTC markdown
Commit 6d4339bb09133406ce211a83b6ee165ff549d4ff
+76 -52
--- src/checkin.c
+++ src/checkin.c
@@ -565,13 +565,12 @@
565565
** parent_rid is the recordid of the parent check-in.
566566
*/
567567
static void prepare_commit_comment(
568568
Blob *pComment,
569569
char *zInit,
570
- const char *zBranch,
571
- int parent_rid,
572
- const char *zUserOvrd
570
+ CheckinInfo *p,
571
+ int parent_rid
573572
){
574573
Blob prompt;
575574
#ifdef _WIN32
576575
int bomSize;
577576
const unsigned char *bom = get_utf8_bom(&bomSize);
@@ -585,13 +584,13 @@
585584
blob_append(&prompt,
586585
"\n"
587586
"# Enter comments on this check-in. Lines beginning with # are ignored.\n"
588587
"#\n", -1
589588
);
590
- blob_appendf(&prompt, "# user: %s\n", zUserOvrd ? zUserOvrd : g.zLogin);
591
- if( zBranch && zBranch[0] ){
592
- blob_appendf(&prompt, "# tags: %s\n#\n", zBranch);
589
+ blob_appendf(&prompt, "# user: %s\n", p->zUserOvrd ? p->zUserOvrd : g.zLogin);
590
+ if( p->zBranch && p->zBranch[0] ){
591
+ blob_appendf(&prompt, "# tags: %s\n#\n", p->zBranch);
593592
}else{
594593
char *zTags = info_tags_of_checkin(parent_rid, 1);
595594
if( zTags ) blob_appendf(&prompt, "# tags: %z\n#\n", zTags);
596595
}
597596
status_report(&prompt, "# ", 1, 0);
@@ -706,28 +705,39 @@
706705
for(i=2; i<g.argc; i++){
707706
fossil_print("%s -> %s\n", g.argv[i], date_in_standard_format(g.argv[i]));
708707
}
709708
}
710709
710
+#if INTERFACE
711
+/*
712
+** The following structure holds some of the information needed to construct a
713
+** check-in manifest.
714
+*/
715
+struct CheckinInfo {
716
+ Blob *pComment; /* Check-in comment text */
717
+ const char *zMimetype; /* Mimetype of check-in command. May be NULL */
718
+ int verifyDate; /* Verify that child is younger */
719
+ Blob *pCksum; /* Repository checksum. May be 0 */
720
+ const char *zDateOvrd; /* Date override. If 0 then use 'now' */
721
+ const char *zUserOvrd; /* User override. If 0 then use g.zLogin */
722
+ const char *zBranch; /* Branch name. May be 0 */
723
+ const char *zColor; /* One-time background color. May be 0 */
724
+ const char *zBrClr; /* Persistent branch color. May be 0 */
725
+ const char **azTag; /* Tags to apply to this check-in */
726
+};
727
+#endif /* INTERFACE */
728
+
711729
/*
712730
** Create a manifest.
713731
*/
714732
static void create_manifest(
715733
Blob *pOut, /* Write the manifest here */
716734
const char *zBaselineUuid, /* UUID of baseline, or zero */
717735
Manifest *pBaseline, /* Make it a delta manifest if not zero */
718
- Blob *pComment, /* Check-in comment text */
719
- int vid, /* blob-id of the parent manifest */
720
- int verifyDate, /* Verify that child is younger */
721
- Blob *pCksum, /* Repository checksum. May be 0 */
722
- const char *zDateOvrd, /* Date override. If 0 then use 'now' */
723
- const char *zUserOvrd, /* User override. If 0 then use g.zLogin */
724
- const char *zBranch, /* Branch name. May be 0 */
725
- const char *zColor, /* One-time background color. May be 0 */
726
- const char *zBrClr, /* Persistent branch color. May be 0 */
727
- const char **azTag, /* Tags to apply to this check-in */
728
- int *pnFBcard /* Number of generated B- and F-cards */
736
+ int vid, /* BLOB.id for the parent check-in */
737
+ CheckinInfo *p, /* Information about the check-in */
738
+ int *pnFBcard /* OUT: Number of generated B- and F-cards */
729739
){
730740
char *zDate; /* Date of the check-in */
731741
char *zParentUuid; /* UUID of parent check-in */
732742
Blob filename; /* A single filename */
733743
int nBasename; /* Size of base filename */
@@ -735,10 +745,11 @@
735745
Stmt q2; /* Query of merge parents */
736746
Blob mcksum; /* Manifest checksum */
737747
ManifestFile *pFile; /* File from the baseline */
738748
int nFBcard = 0; /* Number of B-cards and F-cards */
739749
int i; /* Loop counter */
750
+ const char *zColor; /* Modified value of p->zColor */
740751
741752
assert( pBaseline==0 || pBaseline->zBaseline==0 );
742753
assert( pBaseline==0 || zBaselineUuid!=0 );
743754
blob_zero(pOut);
744755
zParentUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", vid);
@@ -748,12 +759,12 @@
748759
pFile = manifest_file_next(pBaseline, 0);
749760
nFBcard++;
750761
}else{
751762
pFile = 0;
752763
}
753
- blob_appendf(pOut, "C %F\n", blob_str(pComment));
754
- zDate = date_in_standard_format(zDateOvrd ? zDateOvrd : "now");
764
+ blob_appendf(pOut, "C %F\n", blob_str(p->pComment));
765
+ zDate = date_in_standard_format(p->zDateOvrd ? p->zDateOvrd : "now");
755766
blob_appendf(pOut, "D %s\n", zDate);
756767
zDate[10] = ' ';
757768
db_prepare(&q,
758769
"SELECT pathname, uuid, origname, blob.rid, isexe, islink,"
759770
" is_selected(vfile.id)"
@@ -827,67 +838,72 @@
827838
while( pFile ){
828839
blob_appendf(pOut, "F %F\n", pFile->zName);
829840
pFile = manifest_file_next(pBaseline, 0);
830841
nFBcard++;
831842
}
843
+ if( p->zMimetype && p->zMimetype[0] ){
844
+ blob_appendf(pOut, "N %F\n", p->zMimetype);
845
+ }
832846
blob_appendf(pOut, "P %s", zParentUuid);
833
- if( verifyDate ) checkin_verify_younger(vid, zParentUuid, zDate);
847
+ if( p->verifyDate ) checkin_verify_younger(vid, zParentUuid, zDate);
834848
free(zParentUuid);
835849
db_prepare(&q2, "SELECT merge FROM vmerge WHERE id=0");
836850
while( db_step(&q2)==SQLITE_ROW ){
837851
char *zMergeUuid;
838852
int mid = db_column_int(&q2, 0);
839853
if( !g.markPrivate && content_is_private(mid) ) continue;
840854
zMergeUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", mid);
841855
if( zMergeUuid ){
842856
blob_appendf(pOut, " %s", zMergeUuid);
843
- if( verifyDate ) checkin_verify_younger(mid, zMergeUuid, zDate);
857
+ if( p->verifyDate ) checkin_verify_younger(mid, zMergeUuid, zDate);
844858
free(zMergeUuid);
845859
}
846860
}
847861
db_finalize(&q2);
848862
free(zDate);
849863
850864
blob_appendf(pOut, "\n");
851
- if( pCksum ) blob_appendf(pOut, "R %b\n", pCksum);
852
- if( zBranch && zBranch[0] ){
865
+ if( p->pCksum ) blob_appendf(pOut, "R %b\n", p->pCksum);
866
+ zColor = p->zColor;
867
+ if( p->zBranch && p->zBranch[0] ){
853868
/* Set tags for the new branch */
854
- if( zBrClr && zBrClr[0] ){
869
+ if( p->zBrClr && p->zBrClr[0] ){
855870
zColor = 0;
856
- blob_appendf(pOut, "T *bgcolor * %F\n", zBrClr);
871
+ blob_appendf(pOut, "T *bgcolor * %F\n", p->zBrClr);
857872
}
858
- blob_appendf(pOut, "T *branch * %F\n", zBranch);
859
- blob_appendf(pOut, "T *sym-%F *\n", zBranch);
873
+ blob_appendf(pOut, "T *branch * %F\n", p->zBranch);
874
+ blob_appendf(pOut, "T *sym-%F *\n", p->zBranch);
860875
}
861876
if( zColor && zColor[0] ){
862877
/* One-time background color */
863878
blob_appendf(pOut, "T +bgcolor * %F\n", zColor);
864879
}
865
- if( azTag ){
866
- for(i=0; azTag[i]; i++){
880
+ if( p->azTag ){
881
+ for(i=0; p->azTag[i]; i++){
867882
/* Add a symbolic tag to this check-in. The tag names have already
868883
** been sorted and converted using the %F format */
869
- blob_appendf(pOut, "T +sym-%s *\n", azTag[i]);
884
+ assert( i==0 || strcmp(p->azTag[i-1], p->azTag[i])<=0 );
885
+ blob_appendf(pOut, "T +sym-%s *\n", p->azTag[i]);
870886
}
871887
}
872
- if( zBranch && zBranch[0] ){
888
+ if( p->zBranch && p->zBranch[0] ){
873889
/* For a new branch, cancel all prior propagating tags */
874890
Stmt q;
875891
db_prepare(&q,
876892
"SELECT tagname FROM tagxref, tag"
877893
" WHERE tagxref.rid=%d AND tagxref.tagid=tag.tagid"
878894
" AND tagtype==2 AND tagname GLOB 'sym-*'"
879895
" AND tagname!='sym-'||%Q"
880896
" ORDER BY tagname",
881
- vid, zBranch);
897
+ vid, p->zBranch);
882898
while( db_step(&q)==SQLITE_ROW ){
883899
const char *zBrTag = db_column_text(&q, 0);
884900
blob_appendf(pOut, "T -%F *\n", zBrTag);
885901
}
886902
db_finalize(&q);
887903
}
888
- blob_appendf(pOut, "U %F\n", zUserOvrd ? zUserOvrd : g.zLogin);
904
+ blob_appendf(pOut, "U %F\n", p->zUserOvrd ? p->zUserOvrd : g.zLogin);
889905
md5sum_blob(pOut, &mcksum);
890906
blob_appendf(pOut, "Z %b\n", &mcksum);
891907
if( pnFBcard ) *pnFBcard = nFBcard;
892908
}
893909
@@ -1092,10 +1108,11 @@
10921108
** --branch NEW-BRANCH-NAME check in to this new branch
10931109
** --branchcolor COLOR apply given COLOR to the branch
10941110
** --comment|-m COMMENT-TEXT use COMMENT-TEXT as commit comment
10951111
** --delta use a delta manifest in the commit process
10961112
** --message-file|-M FILE read the commit comment from given file
1113
+** --mimetype MIMETYPE mimetype of check-in comment
10971114
** --no-warnings omit all warnings about file contents
10981115
** --nosign do not attempt to sign this commit with gpg
10991116
** --private do not sync changes and their descendants
11001117
** --tag TAG-NAME assign given tag TAG-NAME to the checkin
11011118
**
@@ -1122,15 +1139,11 @@
11221139
int allowOlder = 0; /* Allow a commit older than its ancestor */
11231140
char *zManifestFile; /* Name of the manifest file */
11241141
int useCksum; /* True if checksums should be computed and verified */
11251142
int outputManifest; /* True to output "manifest" and "manifest.uuid" */
11261143
int testRun; /* True for a test run. Debugging only */
1127
- const char *zBranch; /* Create a new branch with this name */
1128
- const char *zBrClr; /* Set background color when branching */
1129
- const char *zColor; /* One-time check-in color */
1130
- const char *zDateOvrd; /* Override date string */
1131
- const char *zUserOvrd; /* Override user name */
1144
+ CheckinInfo sCiInfo; /* Information about this check-in */
11321145
const char *zComFile; /* Read commit message from this file */
11331146
int nTag = 0; /* Number of --tag arguments */
11341147
const char *zTag; /* A single --tag argument */
11351148
const char **azTag = 0;/* Array of all --tag arguments */
11361149
Blob manifest; /* Manifest in baseline form */
@@ -1142,10 +1155,11 @@
11421155
int nConflict = 0; /* Number of unresolved merge conflicts */
11431156
int abortCommit = 0;
11441157
Blob ans;
11451158
char cReply;
11461159
1160
+ memset(&sCiInfo, 0, sizeof(sCiInfo));
11471161
url_proxy_options();
11481162
noSign = find_option("nosign",0,0)!=0;
11491163
forceDelta = find_option("delta",0,0)!=0;
11501164
forceBaseline = find_option("baseline",0,0)!=0;
11511165
if( forceDelta && forceBaseline ){
@@ -1157,27 +1171,30 @@
11571171
allowConflict = find_option("allow-conflict",0,0)!=0;
11581172
allowEmpty = find_option("allow-empty",0,0)!=0;
11591173
allowFork = find_option("allow-fork",0,0)!=0;
11601174
allowOlder = find_option("allow-older",0,0)!=0;
11611175
noWarningFlag = find_option("no-warnings", 0, 0)!=0;
1162
- zBranch = find_option("branch","b",1);
1163
- zColor = find_option("bgcolor",0,1);
1164
- zBrClr = find_option("branchcolor",0,1);
1176
+ sCiInfo.zBranch = find_option("branch","b",1);
1177
+ sCiInfo.zColor = find_option("bgcolor",0,1);
1178
+ sCiInfo.zBrClr = find_option("branchcolor",0,1);
1179
+ sCiInfo.zMimetype = find_option("mimetype",0,1);
11651180
while( (zTag = find_option("tag",0,1))!=0 ){
11661181
if( zTag[0]==0 ) continue;
1167
- azTag = fossil_realloc((void *)azTag, sizeof(char*)*(nTag+2));
1168
- azTag[nTag++] = zTag;
1169
- azTag[nTag] = 0;
1182
+ sCiInfo.azTag = fossil_realloc((void*)sCiInfo.azTag, sizeof(char*)*(nTag+2));
1183
+ sCiInfo.azTag[nTag++] = zTag;
1184
+ sCiInfo.azTag[nTag] = 0;
11701185
}
11711186
zComFile = find_option("message-file", "M", 1);
11721187
if( find_option("private",0,0) ){
11731188
g.markPrivate = 1;
1174
- if( zBranch==0 ) zBranch = "private";
1175
- if( zBrClr==0 && zColor==0 ) zBrClr = "#fec084"; /* Orange */
1189
+ if( sCiInfo.zBranch==0 ) sCiInfo.zBranch = "private";
1190
+ if( sCiInfo.zBrClr==0 && sCiInfo.zColor==0 ){
1191
+ sCiInfo.zBrClr = "#fec084"; /* Orange */
1192
+ }
11761193
}
1177
- zDateOvrd = find_option("date-override",0,1);
1178
- zUserOvrd = find_option("user-override",0,1);
1194
+ sCiInfo.zDateOvrd = find_option("date-override",0,1);
1195
+ sCiInfo.zUserOvrd = find_option("user-override",0,1);
11791196
db_must_be_within_tree();
11801197
noSign = db_get_boolean("omitsign", 0)|noSign;
11811198
if( db_get_boolean("clearsign", 0)==0 ){ noSign = 1; }
11821199
useCksum = db_get_boolean("repo-cksum", 1);
11831200
outputManifest = db_get_boolean("manifest", 0);
@@ -1309,11 +1326,11 @@
13091326
13101327
/*
13111328
** Do not allow a commit that will cause a fork unless the --allow-fork
13121329
** or --force flags is used, or unless this is a private check-in.
13131330
*/
1314
- if( zBranch==0 && allowFork==0 && forceFlag==0
1331
+ if( sCiInfo.zBranch==0 && allowFork==0 && forceFlag==0
13151332
&& g.markPrivate==0 && !is_a_leaf(vid)
13161333
){
13171334
fossil_fatal("would fork. \"update\" first or use --allow-fork.");
13181335
}
13191336
@@ -1334,11 +1351,11 @@
13341351
blob_zero(&comment);
13351352
blob_read_from_file(&comment, zComFile);
13361353
blob_to_utf8_no_bom(&comment, 1);
13371354
}else{
13381355
char *zInit = db_text(0, "SELECT value FROM vvar WHERE name='ci-comment'");
1339
- prepare_commit_comment(&comment, zInit, zBranch, vid, zUserOvrd);
1356
+ prepare_commit_comment(&comment, zInit, &sCiInfo, vid);
13401357
if( zInit && zInit[0] && fossil_strcmp(zInit, blob_str(&comment))==0 ){
13411358
blob_zero(&ans);
13421359
prompt_user("unchanged check-in comment. continue (y/N)? ", &ans);
13431360
cReply = blob_str(&ans)[0];
13441361
if( cReply!='y' && cReply!='Y' ) fossil_exit(1);;
@@ -1424,17 +1441,21 @@
14241441
14251442
/* Create the new manifest */
14261443
if( blob_size(&comment)==0 ){
14271444
blob_append(&comment, "(no comment)", -1);
14281445
}
1446
+ sCiInfo.pComment = &comment;
1447
+ sCiInfo.pCksum = useCksum ? &cksum1 : 0;
14291448
if( forceDelta ){
14301449
blob_zero(&manifest);
14311450
}else{
1432
- create_manifest(&manifest, 0, 0, &comment, vid,
1451
+ create_manifest(&manifest, 0, 0, vid, &sCiInfo, &szB);
1452
+#if 0
14331453
!allowOlder && !forceFlag, useCksum ? &cksum1 : 0,
14341454
zDateOvrd, zUserOvrd, zBranch, zColor, zBrClr,
14351455
azTag, &szB);
1456
+#endif
14361457
}
14371458
14381459
/* See if a delta-manifest would be more appropriate */
14391460
if( !forceBaseline ){
14401461
const char *zBaselineUuid;
@@ -1448,14 +1469,17 @@
14481469
zBaselineUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", vid);
14491470
pBaseline = pParent;
14501471
}
14511472
if( pBaseline ){
14521473
Blob delta;
1453
- create_manifest(&delta, zBaselineUuid, pBaseline, &comment, vid,
1474
+ create_manifest(&delta, zBaselineUuid, pBaseline, vid, &sCiInfo, &szD);
1475
+
1476
+#if 0
14541477
!allowOlder && !forceFlag, useCksum ? &cksum1 : 0,
14551478
zDateOvrd, zUserOvrd, zBranch, zColor, zBrClr,
14561479
azTag, &szD);
1480
+#endif
14571481
/*
14581482
** At this point, two manifests have been constructed, either of
14591483
** which would work for this checkin. The first manifest (held
14601484
** in the "manifest" variable) is a baseline manifest and the second
14611485
** (held in variable named "delta") is a delta manifest. The
14621486
--- src/checkin.c
+++ src/checkin.c
@@ -565,13 +565,12 @@
565 ** parent_rid is the recordid of the parent check-in.
566 */
567 static void prepare_commit_comment(
568 Blob *pComment,
569 char *zInit,
570 const char *zBranch,
571 int parent_rid,
572 const char *zUserOvrd
573 ){
574 Blob prompt;
575 #ifdef _WIN32
576 int bomSize;
577 const unsigned char *bom = get_utf8_bom(&bomSize);
@@ -585,13 +584,13 @@
585 blob_append(&prompt,
586 "\n"
587 "# Enter comments on this check-in. Lines beginning with # are ignored.\n"
588 "#\n", -1
589 );
590 blob_appendf(&prompt, "# user: %s\n", zUserOvrd ? zUserOvrd : g.zLogin);
591 if( zBranch && zBranch[0] ){
592 blob_appendf(&prompt, "# tags: %s\n#\n", zBranch);
593 }else{
594 char *zTags = info_tags_of_checkin(parent_rid, 1);
595 if( zTags ) blob_appendf(&prompt, "# tags: %z\n#\n", zTags);
596 }
597 status_report(&prompt, "# ", 1, 0);
@@ -706,28 +705,39 @@
706 for(i=2; i<g.argc; i++){
707 fossil_print("%s -> %s\n", g.argv[i], date_in_standard_format(g.argv[i]));
708 }
709 }
710
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
711 /*
712 ** Create a manifest.
713 */
714 static void create_manifest(
715 Blob *pOut, /* Write the manifest here */
716 const char *zBaselineUuid, /* UUID of baseline, or zero */
717 Manifest *pBaseline, /* Make it a delta manifest if not zero */
718 Blob *pComment, /* Check-in comment text */
719 int vid, /* blob-id of the parent manifest */
720 int verifyDate, /* Verify that child is younger */
721 Blob *pCksum, /* Repository checksum. May be 0 */
722 const char *zDateOvrd, /* Date override. If 0 then use 'now' */
723 const char *zUserOvrd, /* User override. If 0 then use g.zLogin */
724 const char *zBranch, /* Branch name. May be 0 */
725 const char *zColor, /* One-time background color. May be 0 */
726 const char *zBrClr, /* Persistent branch color. May be 0 */
727 const char **azTag, /* Tags to apply to this check-in */
728 int *pnFBcard /* Number of generated B- and F-cards */
729 ){
730 char *zDate; /* Date of the check-in */
731 char *zParentUuid; /* UUID of parent check-in */
732 Blob filename; /* A single filename */
733 int nBasename; /* Size of base filename */
@@ -735,10 +745,11 @@
735 Stmt q2; /* Query of merge parents */
736 Blob mcksum; /* Manifest checksum */
737 ManifestFile *pFile; /* File from the baseline */
738 int nFBcard = 0; /* Number of B-cards and F-cards */
739 int i; /* Loop counter */
 
740
741 assert( pBaseline==0 || pBaseline->zBaseline==0 );
742 assert( pBaseline==0 || zBaselineUuid!=0 );
743 blob_zero(pOut);
744 zParentUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", vid);
@@ -748,12 +759,12 @@
748 pFile = manifest_file_next(pBaseline, 0);
749 nFBcard++;
750 }else{
751 pFile = 0;
752 }
753 blob_appendf(pOut, "C %F\n", blob_str(pComment));
754 zDate = date_in_standard_format(zDateOvrd ? zDateOvrd : "now");
755 blob_appendf(pOut, "D %s\n", zDate);
756 zDate[10] = ' ';
757 db_prepare(&q,
758 "SELECT pathname, uuid, origname, blob.rid, isexe, islink,"
759 " is_selected(vfile.id)"
@@ -827,67 +838,72 @@
827 while( pFile ){
828 blob_appendf(pOut, "F %F\n", pFile->zName);
829 pFile = manifest_file_next(pBaseline, 0);
830 nFBcard++;
831 }
 
 
 
832 blob_appendf(pOut, "P %s", zParentUuid);
833 if( verifyDate ) checkin_verify_younger(vid, zParentUuid, zDate);
834 free(zParentUuid);
835 db_prepare(&q2, "SELECT merge FROM vmerge WHERE id=0");
836 while( db_step(&q2)==SQLITE_ROW ){
837 char *zMergeUuid;
838 int mid = db_column_int(&q2, 0);
839 if( !g.markPrivate && content_is_private(mid) ) continue;
840 zMergeUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", mid);
841 if( zMergeUuid ){
842 blob_appendf(pOut, " %s", zMergeUuid);
843 if( verifyDate ) checkin_verify_younger(mid, zMergeUuid, zDate);
844 free(zMergeUuid);
845 }
846 }
847 db_finalize(&q2);
848 free(zDate);
849
850 blob_appendf(pOut, "\n");
851 if( pCksum ) blob_appendf(pOut, "R %b\n", pCksum);
852 if( zBranch && zBranch[0] ){
 
853 /* Set tags for the new branch */
854 if( zBrClr && zBrClr[0] ){
855 zColor = 0;
856 blob_appendf(pOut, "T *bgcolor * %F\n", zBrClr);
857 }
858 blob_appendf(pOut, "T *branch * %F\n", zBranch);
859 blob_appendf(pOut, "T *sym-%F *\n", zBranch);
860 }
861 if( zColor && zColor[0] ){
862 /* One-time background color */
863 blob_appendf(pOut, "T +bgcolor * %F\n", zColor);
864 }
865 if( azTag ){
866 for(i=0; azTag[i]; i++){
867 /* Add a symbolic tag to this check-in. The tag names have already
868 ** been sorted and converted using the %F format */
869 blob_appendf(pOut, "T +sym-%s *\n", azTag[i]);
 
870 }
871 }
872 if( zBranch && zBranch[0] ){
873 /* For a new branch, cancel all prior propagating tags */
874 Stmt q;
875 db_prepare(&q,
876 "SELECT tagname FROM tagxref, tag"
877 " WHERE tagxref.rid=%d AND tagxref.tagid=tag.tagid"
878 " AND tagtype==2 AND tagname GLOB 'sym-*'"
879 " AND tagname!='sym-'||%Q"
880 " ORDER BY tagname",
881 vid, zBranch);
882 while( db_step(&q)==SQLITE_ROW ){
883 const char *zBrTag = db_column_text(&q, 0);
884 blob_appendf(pOut, "T -%F *\n", zBrTag);
885 }
886 db_finalize(&q);
887 }
888 blob_appendf(pOut, "U %F\n", zUserOvrd ? zUserOvrd : g.zLogin);
889 md5sum_blob(pOut, &mcksum);
890 blob_appendf(pOut, "Z %b\n", &mcksum);
891 if( pnFBcard ) *pnFBcard = nFBcard;
892 }
893
@@ -1092,10 +1108,11 @@
1092 ** --branch NEW-BRANCH-NAME check in to this new branch
1093 ** --branchcolor COLOR apply given COLOR to the branch
1094 ** --comment|-m COMMENT-TEXT use COMMENT-TEXT as commit comment
1095 ** --delta use a delta manifest in the commit process
1096 ** --message-file|-M FILE read the commit comment from given file
 
1097 ** --no-warnings omit all warnings about file contents
1098 ** --nosign do not attempt to sign this commit with gpg
1099 ** --private do not sync changes and their descendants
1100 ** --tag TAG-NAME assign given tag TAG-NAME to the checkin
1101 **
@@ -1122,15 +1139,11 @@
1122 int allowOlder = 0; /* Allow a commit older than its ancestor */
1123 char *zManifestFile; /* Name of the manifest file */
1124 int useCksum; /* True if checksums should be computed and verified */
1125 int outputManifest; /* True to output "manifest" and "manifest.uuid" */
1126 int testRun; /* True for a test run. Debugging only */
1127 const char *zBranch; /* Create a new branch with this name */
1128 const char *zBrClr; /* Set background color when branching */
1129 const char *zColor; /* One-time check-in color */
1130 const char *zDateOvrd; /* Override date string */
1131 const char *zUserOvrd; /* Override user name */
1132 const char *zComFile; /* Read commit message from this file */
1133 int nTag = 0; /* Number of --tag arguments */
1134 const char *zTag; /* A single --tag argument */
1135 const char **azTag = 0;/* Array of all --tag arguments */
1136 Blob manifest; /* Manifest in baseline form */
@@ -1142,10 +1155,11 @@
1142 int nConflict = 0; /* Number of unresolved merge conflicts */
1143 int abortCommit = 0;
1144 Blob ans;
1145 char cReply;
1146
 
1147 url_proxy_options();
1148 noSign = find_option("nosign",0,0)!=0;
1149 forceDelta = find_option("delta",0,0)!=0;
1150 forceBaseline = find_option("baseline",0,0)!=0;
1151 if( forceDelta && forceBaseline ){
@@ -1157,27 +1171,30 @@
1157 allowConflict = find_option("allow-conflict",0,0)!=0;
1158 allowEmpty = find_option("allow-empty",0,0)!=0;
1159 allowFork = find_option("allow-fork",0,0)!=0;
1160 allowOlder = find_option("allow-older",0,0)!=0;
1161 noWarningFlag = find_option("no-warnings", 0, 0)!=0;
1162 zBranch = find_option("branch","b",1);
1163 zColor = find_option("bgcolor",0,1);
1164 zBrClr = find_option("branchcolor",0,1);
 
1165 while( (zTag = find_option("tag",0,1))!=0 ){
1166 if( zTag[0]==0 ) continue;
1167 azTag = fossil_realloc((void *)azTag, sizeof(char*)*(nTag+2));
1168 azTag[nTag++] = zTag;
1169 azTag[nTag] = 0;
1170 }
1171 zComFile = find_option("message-file", "M", 1);
1172 if( find_option("private",0,0) ){
1173 g.markPrivate = 1;
1174 if( zBranch==0 ) zBranch = "private";
1175 if( zBrClr==0 && zColor==0 ) zBrClr = "#fec084"; /* Orange */
 
 
1176 }
1177 zDateOvrd = find_option("date-override",0,1);
1178 zUserOvrd = find_option("user-override",0,1);
1179 db_must_be_within_tree();
1180 noSign = db_get_boolean("omitsign", 0)|noSign;
1181 if( db_get_boolean("clearsign", 0)==0 ){ noSign = 1; }
1182 useCksum = db_get_boolean("repo-cksum", 1);
1183 outputManifest = db_get_boolean("manifest", 0);
@@ -1309,11 +1326,11 @@
1309
1310 /*
1311 ** Do not allow a commit that will cause a fork unless the --allow-fork
1312 ** or --force flags is used, or unless this is a private check-in.
1313 */
1314 if( zBranch==0 && allowFork==0 && forceFlag==0
1315 && g.markPrivate==0 && !is_a_leaf(vid)
1316 ){
1317 fossil_fatal("would fork. \"update\" first or use --allow-fork.");
1318 }
1319
@@ -1334,11 +1351,11 @@
1334 blob_zero(&comment);
1335 blob_read_from_file(&comment, zComFile);
1336 blob_to_utf8_no_bom(&comment, 1);
1337 }else{
1338 char *zInit = db_text(0, "SELECT value FROM vvar WHERE name='ci-comment'");
1339 prepare_commit_comment(&comment, zInit, zBranch, vid, zUserOvrd);
1340 if( zInit && zInit[0] && fossil_strcmp(zInit, blob_str(&comment))==0 ){
1341 blob_zero(&ans);
1342 prompt_user("unchanged check-in comment. continue (y/N)? ", &ans);
1343 cReply = blob_str(&ans)[0];
1344 if( cReply!='y' && cReply!='Y' ) fossil_exit(1);;
@@ -1424,17 +1441,21 @@
1424
1425 /* Create the new manifest */
1426 if( blob_size(&comment)==0 ){
1427 blob_append(&comment, "(no comment)", -1);
1428 }
 
 
1429 if( forceDelta ){
1430 blob_zero(&manifest);
1431 }else{
1432 create_manifest(&manifest, 0, 0, &comment, vid,
 
1433 !allowOlder && !forceFlag, useCksum ? &cksum1 : 0,
1434 zDateOvrd, zUserOvrd, zBranch, zColor, zBrClr,
1435 azTag, &szB);
 
1436 }
1437
1438 /* See if a delta-manifest would be more appropriate */
1439 if( !forceBaseline ){
1440 const char *zBaselineUuid;
@@ -1448,14 +1469,17 @@
1448 zBaselineUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", vid);
1449 pBaseline = pParent;
1450 }
1451 if( pBaseline ){
1452 Blob delta;
1453 create_manifest(&delta, zBaselineUuid, pBaseline, &comment, vid,
 
 
1454 !allowOlder && !forceFlag, useCksum ? &cksum1 : 0,
1455 zDateOvrd, zUserOvrd, zBranch, zColor, zBrClr,
1456 azTag, &szD);
 
1457 /*
1458 ** At this point, two manifests have been constructed, either of
1459 ** which would work for this checkin. The first manifest (held
1460 ** in the "manifest" variable) is a baseline manifest and the second
1461 ** (held in variable named "delta") is a delta manifest. The
1462
--- src/checkin.c
+++ src/checkin.c
@@ -565,13 +565,12 @@
565 ** parent_rid is the recordid of the parent check-in.
566 */
567 static void prepare_commit_comment(
568 Blob *pComment,
569 char *zInit,
570 CheckinInfo *p,
571 int parent_rid
 
572 ){
573 Blob prompt;
574 #ifdef _WIN32
575 int bomSize;
576 const unsigned char *bom = get_utf8_bom(&bomSize);
@@ -585,13 +584,13 @@
584 blob_append(&prompt,
585 "\n"
586 "# Enter comments on this check-in. Lines beginning with # are ignored.\n"
587 "#\n", -1
588 );
589 blob_appendf(&prompt, "# user: %s\n", p->zUserOvrd ? p->zUserOvrd : g.zLogin);
590 if( p->zBranch && p->zBranch[0] ){
591 blob_appendf(&prompt, "# tags: %s\n#\n", p->zBranch);
592 }else{
593 char *zTags = info_tags_of_checkin(parent_rid, 1);
594 if( zTags ) blob_appendf(&prompt, "# tags: %z\n#\n", zTags);
595 }
596 status_report(&prompt, "# ", 1, 0);
@@ -706,28 +705,39 @@
705 for(i=2; i<g.argc; i++){
706 fossil_print("%s -> %s\n", g.argv[i], date_in_standard_format(g.argv[i]));
707 }
708 }
709
710 #if INTERFACE
711 /*
712 ** The following structure holds some of the information needed to construct a
713 ** check-in manifest.
714 */
715 struct CheckinInfo {
716 Blob *pComment; /* Check-in comment text */
717 const char *zMimetype; /* Mimetype of check-in command. May be NULL */
718 int verifyDate; /* Verify that child is younger */
719 Blob *pCksum; /* Repository checksum. May be 0 */
720 const char *zDateOvrd; /* Date override. If 0 then use 'now' */
721 const char *zUserOvrd; /* User override. If 0 then use g.zLogin */
722 const char *zBranch; /* Branch name. May be 0 */
723 const char *zColor; /* One-time background color. May be 0 */
724 const char *zBrClr; /* Persistent branch color. May be 0 */
725 const char **azTag; /* Tags to apply to this check-in */
726 };
727 #endif /* INTERFACE */
728
729 /*
730 ** Create a manifest.
731 */
732 static void create_manifest(
733 Blob *pOut, /* Write the manifest here */
734 const char *zBaselineUuid, /* UUID of baseline, or zero */
735 Manifest *pBaseline, /* Make it a delta manifest if not zero */
736 int vid, /* BLOB.id for the parent check-in */
737 CheckinInfo *p, /* Information about the check-in */
738 int *pnFBcard /* OUT: Number of generated B- and F-cards */
 
 
 
 
 
 
 
 
739 ){
740 char *zDate; /* Date of the check-in */
741 char *zParentUuid; /* UUID of parent check-in */
742 Blob filename; /* A single filename */
743 int nBasename; /* Size of base filename */
@@ -735,10 +745,11 @@
745 Stmt q2; /* Query of merge parents */
746 Blob mcksum; /* Manifest checksum */
747 ManifestFile *pFile; /* File from the baseline */
748 int nFBcard = 0; /* Number of B-cards and F-cards */
749 int i; /* Loop counter */
750 const char *zColor; /* Modified value of p->zColor */
751
752 assert( pBaseline==0 || pBaseline->zBaseline==0 );
753 assert( pBaseline==0 || zBaselineUuid!=0 );
754 blob_zero(pOut);
755 zParentUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", vid);
@@ -748,12 +759,12 @@
759 pFile = manifest_file_next(pBaseline, 0);
760 nFBcard++;
761 }else{
762 pFile = 0;
763 }
764 blob_appendf(pOut, "C %F\n", blob_str(p->pComment));
765 zDate = date_in_standard_format(p->zDateOvrd ? p->zDateOvrd : "now");
766 blob_appendf(pOut, "D %s\n", zDate);
767 zDate[10] = ' ';
768 db_prepare(&q,
769 "SELECT pathname, uuid, origname, blob.rid, isexe, islink,"
770 " is_selected(vfile.id)"
@@ -827,67 +838,72 @@
838 while( pFile ){
839 blob_appendf(pOut, "F %F\n", pFile->zName);
840 pFile = manifest_file_next(pBaseline, 0);
841 nFBcard++;
842 }
843 if( p->zMimetype && p->zMimetype[0] ){
844 blob_appendf(pOut, "N %F\n", p->zMimetype);
845 }
846 blob_appendf(pOut, "P %s", zParentUuid);
847 if( p->verifyDate ) checkin_verify_younger(vid, zParentUuid, zDate);
848 free(zParentUuid);
849 db_prepare(&q2, "SELECT merge FROM vmerge WHERE id=0");
850 while( db_step(&q2)==SQLITE_ROW ){
851 char *zMergeUuid;
852 int mid = db_column_int(&q2, 0);
853 if( !g.markPrivate && content_is_private(mid) ) continue;
854 zMergeUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", mid);
855 if( zMergeUuid ){
856 blob_appendf(pOut, " %s", zMergeUuid);
857 if( p->verifyDate ) checkin_verify_younger(mid, zMergeUuid, zDate);
858 free(zMergeUuid);
859 }
860 }
861 db_finalize(&q2);
862 free(zDate);
863
864 blob_appendf(pOut, "\n");
865 if( p->pCksum ) blob_appendf(pOut, "R %b\n", p->pCksum);
866 zColor = p->zColor;
867 if( p->zBranch && p->zBranch[0] ){
868 /* Set tags for the new branch */
869 if( p->zBrClr && p->zBrClr[0] ){
870 zColor = 0;
871 blob_appendf(pOut, "T *bgcolor * %F\n", p->zBrClr);
872 }
873 blob_appendf(pOut, "T *branch * %F\n", p->zBranch);
874 blob_appendf(pOut, "T *sym-%F *\n", p->zBranch);
875 }
876 if( zColor && zColor[0] ){
877 /* One-time background color */
878 blob_appendf(pOut, "T +bgcolor * %F\n", zColor);
879 }
880 if( p->azTag ){
881 for(i=0; p->azTag[i]; i++){
882 /* Add a symbolic tag to this check-in. The tag names have already
883 ** been sorted and converted using the %F format */
884 assert( i==0 || strcmp(p->azTag[i-1], p->azTag[i])<=0 );
885 blob_appendf(pOut, "T +sym-%s *\n", p->azTag[i]);
886 }
887 }
888 if( p->zBranch && p->zBranch[0] ){
889 /* For a new branch, cancel all prior propagating tags */
890 Stmt q;
891 db_prepare(&q,
892 "SELECT tagname FROM tagxref, tag"
893 " WHERE tagxref.rid=%d AND tagxref.tagid=tag.tagid"
894 " AND tagtype==2 AND tagname GLOB 'sym-*'"
895 " AND tagname!='sym-'||%Q"
896 " ORDER BY tagname",
897 vid, p->zBranch);
898 while( db_step(&q)==SQLITE_ROW ){
899 const char *zBrTag = db_column_text(&q, 0);
900 blob_appendf(pOut, "T -%F *\n", zBrTag);
901 }
902 db_finalize(&q);
903 }
904 blob_appendf(pOut, "U %F\n", p->zUserOvrd ? p->zUserOvrd : g.zLogin);
905 md5sum_blob(pOut, &mcksum);
906 blob_appendf(pOut, "Z %b\n", &mcksum);
907 if( pnFBcard ) *pnFBcard = nFBcard;
908 }
909
@@ -1092,10 +1108,11 @@
1108 ** --branch NEW-BRANCH-NAME check in to this new branch
1109 ** --branchcolor COLOR apply given COLOR to the branch
1110 ** --comment|-m COMMENT-TEXT use COMMENT-TEXT as commit comment
1111 ** --delta use a delta manifest in the commit process
1112 ** --message-file|-M FILE read the commit comment from given file
1113 ** --mimetype MIMETYPE mimetype of check-in comment
1114 ** --no-warnings omit all warnings about file contents
1115 ** --nosign do not attempt to sign this commit with gpg
1116 ** --private do not sync changes and their descendants
1117 ** --tag TAG-NAME assign given tag TAG-NAME to the checkin
1118 **
@@ -1122,15 +1139,11 @@
1139 int allowOlder = 0; /* Allow a commit older than its ancestor */
1140 char *zManifestFile; /* Name of the manifest file */
1141 int useCksum; /* True if checksums should be computed and verified */
1142 int outputManifest; /* True to output "manifest" and "manifest.uuid" */
1143 int testRun; /* True for a test run. Debugging only */
1144 CheckinInfo sCiInfo; /* Information about this check-in */
 
 
 
 
1145 const char *zComFile; /* Read commit message from this file */
1146 int nTag = 0; /* Number of --tag arguments */
1147 const char *zTag; /* A single --tag argument */
1148 const char **azTag = 0;/* Array of all --tag arguments */
1149 Blob manifest; /* Manifest in baseline form */
@@ -1142,10 +1155,11 @@
1155 int nConflict = 0; /* Number of unresolved merge conflicts */
1156 int abortCommit = 0;
1157 Blob ans;
1158 char cReply;
1159
1160 memset(&sCiInfo, 0, sizeof(sCiInfo));
1161 url_proxy_options();
1162 noSign = find_option("nosign",0,0)!=0;
1163 forceDelta = find_option("delta",0,0)!=0;
1164 forceBaseline = find_option("baseline",0,0)!=0;
1165 if( forceDelta && forceBaseline ){
@@ -1157,27 +1171,30 @@
1171 allowConflict = find_option("allow-conflict",0,0)!=0;
1172 allowEmpty = find_option("allow-empty",0,0)!=0;
1173 allowFork = find_option("allow-fork",0,0)!=0;
1174 allowOlder = find_option("allow-older",0,0)!=0;
1175 noWarningFlag = find_option("no-warnings", 0, 0)!=0;
1176 sCiInfo.zBranch = find_option("branch","b",1);
1177 sCiInfo.zColor = find_option("bgcolor",0,1);
1178 sCiInfo.zBrClr = find_option("branchcolor",0,1);
1179 sCiInfo.zMimetype = find_option("mimetype",0,1);
1180 while( (zTag = find_option("tag",0,1))!=0 ){
1181 if( zTag[0]==0 ) continue;
1182 sCiInfo.azTag = fossil_realloc((void*)sCiInfo.azTag, sizeof(char*)*(nTag+2));
1183 sCiInfo.azTag[nTag++] = zTag;
1184 sCiInfo.azTag[nTag] = 0;
1185 }
1186 zComFile = find_option("message-file", "M", 1);
1187 if( find_option("private",0,0) ){
1188 g.markPrivate = 1;
1189 if( sCiInfo.zBranch==0 ) sCiInfo.zBranch = "private";
1190 if( sCiInfo.zBrClr==0 && sCiInfo.zColor==0 ){
1191 sCiInfo.zBrClr = "#fec084"; /* Orange */
1192 }
1193 }
1194 sCiInfo.zDateOvrd = find_option("date-override",0,1);
1195 sCiInfo.zUserOvrd = find_option("user-override",0,1);
1196 db_must_be_within_tree();
1197 noSign = db_get_boolean("omitsign", 0)|noSign;
1198 if( db_get_boolean("clearsign", 0)==0 ){ noSign = 1; }
1199 useCksum = db_get_boolean("repo-cksum", 1);
1200 outputManifest = db_get_boolean("manifest", 0);
@@ -1309,11 +1326,11 @@
1326
1327 /*
1328 ** Do not allow a commit that will cause a fork unless the --allow-fork
1329 ** or --force flags is used, or unless this is a private check-in.
1330 */
1331 if( sCiInfo.zBranch==0 && allowFork==0 && forceFlag==0
1332 && g.markPrivate==0 && !is_a_leaf(vid)
1333 ){
1334 fossil_fatal("would fork. \"update\" first or use --allow-fork.");
1335 }
1336
@@ -1334,11 +1351,11 @@
1351 blob_zero(&comment);
1352 blob_read_from_file(&comment, zComFile);
1353 blob_to_utf8_no_bom(&comment, 1);
1354 }else{
1355 char *zInit = db_text(0, "SELECT value FROM vvar WHERE name='ci-comment'");
1356 prepare_commit_comment(&comment, zInit, &sCiInfo, vid);
1357 if( zInit && zInit[0] && fossil_strcmp(zInit, blob_str(&comment))==0 ){
1358 blob_zero(&ans);
1359 prompt_user("unchanged check-in comment. continue (y/N)? ", &ans);
1360 cReply = blob_str(&ans)[0];
1361 if( cReply!='y' && cReply!='Y' ) fossil_exit(1);;
@@ -1424,17 +1441,21 @@
1441
1442 /* Create the new manifest */
1443 if( blob_size(&comment)==0 ){
1444 blob_append(&comment, "(no comment)", -1);
1445 }
1446 sCiInfo.pComment = &comment;
1447 sCiInfo.pCksum = useCksum ? &cksum1 : 0;
1448 if( forceDelta ){
1449 blob_zero(&manifest);
1450 }else{
1451 create_manifest(&manifest, 0, 0, vid, &sCiInfo, &szB);
1452 #if 0
1453 !allowOlder && !forceFlag, useCksum ? &cksum1 : 0,
1454 zDateOvrd, zUserOvrd, zBranch, zColor, zBrClr,
1455 azTag, &szB);
1456 #endif
1457 }
1458
1459 /* See if a delta-manifest would be more appropriate */
1460 if( !forceBaseline ){
1461 const char *zBaselineUuid;
@@ -1448,14 +1469,17 @@
1469 zBaselineUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", vid);
1470 pBaseline = pParent;
1471 }
1472 if( pBaseline ){
1473 Blob delta;
1474 create_manifest(&delta, zBaselineUuid, pBaseline, vid, &sCiInfo, &szD);
1475
1476 #if 0
1477 !allowOlder && !forceFlag, useCksum ? &cksum1 : 0,
1478 zDateOvrd, zUserOvrd, zBranch, zColor, zBrClr,
1479 azTag, &szD);
1480 #endif
1481 /*
1482 ** At this point, two manifests have been constructed, either of
1483 ** which would work for this checkin. The first manifest (held
1484 ** in the "manifest" variable) is a baseline manifest and the second
1485 ** (held in variable named "delta") is a delta manifest. The
1486
--- src/manifest.c
+++ src/manifest.c
@@ -653,10 +653,11 @@
653653
*/
654654
case 'N': {
655655
if( p->zMimetype!=0 ) SYNTAX("more than one N-card");
656656
p->zMimetype = next_token(&x,0);
657657
if( p->zMimetype==0 ) SYNTAX("missing mimetype on N-card");
658
+ defossilize(p->zMimetype);
658659
break;
659660
}
660661
661662
/*
662663
** P <uuid> ...
663664
--- src/manifest.c
+++ src/manifest.c
@@ -653,10 +653,11 @@
653 */
654 case 'N': {
655 if( p->zMimetype!=0 ) SYNTAX("more than one N-card");
656 p->zMimetype = next_token(&x,0);
657 if( p->zMimetype==0 ) SYNTAX("missing mimetype on N-card");
 
658 break;
659 }
660
661 /*
662 ** P <uuid> ...
663
--- src/manifest.c
+++ src/manifest.c
@@ -653,10 +653,11 @@
653 */
654 case 'N': {
655 if( p->zMimetype!=0 ) SYNTAX("more than one N-card");
656 p->zMimetype = next_token(&x,0);
657 if( p->zMimetype==0 ) SYNTAX("missing mimetype on N-card");
658 defossilize(p->zMimetype);
659 break;
660 }
661
662 /*
663 ** P <uuid> ...
664
--- www/fileformat.wiki
+++ www/fileformat.wiki
@@ -99,11 +99,11 @@
9999
<blockquote>
100100
<b>B</b> <i>baseline-manifest</i><br>
101101
<b>C</b> <i>checkin-comment</i><br>
102102
<b>D</b> <i>time-and-date-stamp</i><br>
103103
<b>F</b> <i>filename</i> <i>SHA1-hash</i> <i>permissions</i> <i>old-name</i><br>
104
-<b>N</b> <i>mimetype</i>
104
+<b>N</b> <i>mimetype</i><br>
105105
<b>P</b> <i>SHA1-hash</i>+<br>
106106
<b>Q</b> (<b>+</b>|<b>-</b>)<i>SHA1-hash ?SHA1-hash?</i><br>
107107
<b>R</b> <i>repository-checksum</i><br>
108108
<b>T</b> (<b>+</b>|<b>-</b>|<b>*</b>)<i>tag-name <b>*</b> ?value?</i><br>
109109
<b>U</b> <i>user-login</i><br>
110110
--- www/fileformat.wiki
+++ www/fileformat.wiki
@@ -99,11 +99,11 @@
99 <blockquote>
100 <b>B</b> <i>baseline-manifest</i><br>
101 <b>C</b> <i>checkin-comment</i><br>
102 <b>D</b> <i>time-and-date-stamp</i><br>
103 <b>F</b> <i>filename</i> <i>SHA1-hash</i> <i>permissions</i> <i>old-name</i><br>
104 <b>N</b> <i>mimetype</i>
105 <b>P</b> <i>SHA1-hash</i>+<br>
106 <b>Q</b> (<b>+</b>|<b>-</b>)<i>SHA1-hash ?SHA1-hash?</i><br>
107 <b>R</b> <i>repository-checksum</i><br>
108 <b>T</b> (<b>+</b>|<b>-</b>|<b>*</b>)<i>tag-name <b>*</b> ?value?</i><br>
109 <b>U</b> <i>user-login</i><br>
110
--- www/fileformat.wiki
+++ www/fileformat.wiki
@@ -99,11 +99,11 @@
99 <blockquote>
100 <b>B</b> <i>baseline-manifest</i><br>
101 <b>C</b> <i>checkin-comment</i><br>
102 <b>D</b> <i>time-and-date-stamp</i><br>
103 <b>F</b> <i>filename</i> <i>SHA1-hash</i> <i>permissions</i> <i>old-name</i><br>
104 <b>N</b> <i>mimetype</i><br>
105 <b>P</b> <i>SHA1-hash</i>+<br>
106 <b>Q</b> (<b>+</b>|<b>-</b>)<i>SHA1-hash ?SHA1-hash?</i><br>
107 <b>R</b> <i>repository-checksum</i><br>
108 <b>T</b> (<b>+</b>|<b>-</b>|<b>*</b>)<i>tag-name <b>*</b> ?value?</i><br>
109 <b>U</b> <i>user-login</i><br>
110

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button