Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | Add "--describe" flag to the "version" command to provide context to the most recent major commit tagged with "version*". Run "touch manifest.descr" in the repo root prior to the first build, then build it a second time to get it bootstrapped. |
|---|---|
| Downloads: | Tarball | ZIP archive |
| Timelines: | family | ancestors | descendants | both | version-cmd-describe |
| Files: | files | file ages | folders |
| SHA3-256: |
4329553d517f7d13037c19bb590f7f42 |
| User & Date: | danield 2022-03-30 15:08:27.489 |
| Original Comment: | Add "--describe" flag to the "version" command to provide context to the most recent major commit tagged with "version*". |
Context
|
2022-06-17
| ||
| 09:32 | Add generation of manifest.descr to Makefile.msc (via makemake.tcl); this can be removed after 'version --describe' support gets built in. check-in: a198cde661 user: danield tags: version-cmd-describe | |
|
2022-03-30
| ||
| 15:08 | Add "--describe" flag to the "version" command to provide context to the most recent major commit tagged with "version*". Run "touch manifest.descr" in the repo root prior to the first build, then build it a second time to get it bootstrapped. check-in: 4329553d51 user: danield tags: version-cmd-describe | |
| 14:45 | Add the new "fossil describe" command. check-in: 36ca266479 user: drh tags: trunk | |
Changes
Changes to src/add.c.
| ︙ | ︙ | |||
60 61 62 63 64 65 66 |
*/
static const struct {
const char *fname;
int flg;
}aManifestflags[] = {
{ "manifest", MFESTFLG_RAW },
{ "manifest.uuid", MFESTFLG_UUID },
| | > | | 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
*/
static const struct {
const char *fname;
int flg;
}aManifestflags[] = {
{ "manifest", MFESTFLG_RAW },
{ "manifest.uuid", MFESTFLG_UUID },
{ "manifest.tags", MFESTFLG_TAGS },
{ "manifest.descr", MFESTFLG_DESCR }
};
static const char *azManifests[4];
/*
** Names of repository files, if they exist in the checkout.
*/
static const char *azRepo[4] = { 0, 0, 0, 0 };
/* Cached setting "manifest" */
|
| ︙ | ︙ |
Changes to src/checkin.c.
| ︙ | ︙ | |||
2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 | int forceDelta = 0; /* Force a delta-manifest */ int forceBaseline = 0; /* Force a baseline-manifest */ int allowConflict = 0; /* Allow unresolve merge conflicts */ int allowEmpty = 0; /* Allow a commit with no changes */ int allowFork = 0; /* Allow the commit to fork */ int allowOlder = 0; /* Allow a commit older than its ancestor */ char *zManifestFile; /* Name of the manifest file */ int useCksum; /* True if checksums should be computed and verified */ int outputManifest; /* True to output "manifest" and "manifest.uuid" */ int dryRunFlag; /* True for a test run. Debugging only */ CheckinInfo sCiInfo; /* Information about this check-in */ const char *zComFile; /* Read commit message from this file */ int nTag = 0; /* Number of --tag arguments */ const char *zTag; /* A single --tag argument */ ManifestFile *pFile; /* File structure in the manifest */ Manifest *pManifest; /* Manifest structure */ Blob manifest; /* Manifest in baseline form */ Blob muuid; /* Manifest uuid */ Blob cksum1, cksum2; /* Before and after commit checksums */ Blob cksum1b; /* Checksum recorded in the manifest */ int szD; /* Size of the delta manifest */ int szB; /* Size of the baseline manifest */ int nConflict = 0; /* Number of unresolved merge conflicts */ int abortCommit = 0; /* Abort the commit due to text format conversions */ Blob ans; /* Answer to continuation prompts */ | > > | 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 | int forceDelta = 0; /* Force a delta-manifest */ int forceBaseline = 0; /* Force a baseline-manifest */ int allowConflict = 0; /* Allow unresolve merge conflicts */ int allowEmpty = 0; /* Allow a commit with no changes */ int allowFork = 0; /* Allow the commit to fork */ int allowOlder = 0; /* Allow a commit older than its ancestor */ char *zManifestFile; /* Name of the manifest file */ char *zDescrFile; /* Name of the description file */ int useCksum; /* True if checksums should be computed and verified */ int outputManifest; /* True to output "manifest" and "manifest.uuid" */ int dryRunFlag; /* True for a test run. Debugging only */ CheckinInfo sCiInfo; /* Information about this check-in */ const char *zComFile; /* Read commit message from this file */ int nTag = 0; /* Number of --tag arguments */ const char *zTag; /* A single --tag argument */ ManifestFile *pFile; /* File structure in the manifest */ Manifest *pManifest; /* Manifest structure */ Blob manifest; /* Manifest in baseline form */ Blob muuid; /* Manifest uuid */ Blob descr; /* Commit description */ Blob cksum1, cksum2; /* Before and after commit checksums */ Blob cksum1b; /* Checksum recorded in the manifest */ int szD; /* Size of the delta manifest */ int szB; /* Size of the baseline manifest */ int nConflict = 0; /* Number of unresolved merge conflicts */ int abortCommit = 0; /* Abort the commit due to text format conversions */ Blob ans; /* Answer to continuation prompts */ |
| ︙ | ︙ | |||
2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 |
zManifestFile = mprintf("%smanifest.uuid", g.zLocalRoot);
blob_zero(&muuid);
blob_appendf(&muuid, "%s\n", zUuid);
blob_write_to_file(&muuid, zManifestFile);
free(zManifestFile);
blob_reset(&muuid);
}
/* Update the vfile and vmerge tables */
db_multi_exec(
"DELETE FROM vfile WHERE (vid!=%d OR deleted) AND is_selected(id);"
"DELETE FROM vmerge;"
"UPDATE vfile SET vid=%d;"
"UPDATE vfile SET rid=mrid, mhash=NULL, chnged=0, deleted=0, origname=NULL"
| > > > > > > > > > > > > | 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 |
zManifestFile = mprintf("%smanifest.uuid", g.zLocalRoot);
blob_zero(&muuid);
blob_appendf(&muuid, "%s\n", zUuid);
blob_write_to_file(&muuid, zManifestFile);
free(zManifestFile);
blob_reset(&muuid);
}
if( outputManifest & MFESTFLG_DESCR ){
CommitDescr cd;
zDescrFile = mprintf("%smanifest.descr", g.zLocalRoot);
blob_zero(&descr);
describe_commit(zUuid, "version*", &cd);
blob_appendf(&descr, "%s-%d-%10.10s%s\n", cd.zRelTagname, cd.nCommitsSince,
cd.zCommitHash, cd.isDirty ? "-dirty" : "");
blob_write_to_file(&descr, zDescrFile);
free(zDescrFile);
blob_reset(&descr);
}
/* Update the vfile and vmerge tables */
db_multi_exec(
"DELETE FROM vfile WHERE (vid!=%d OR deleted) AND is_selected(id);"
"DELETE FROM vmerge;"
"UPDATE vfile SET vid=%d;"
"UPDATE vfile SET rid=mrid, mhash=NULL, chnged=0, deleted=0, origname=NULL"
|
| ︙ | ︙ |
Changes to src/checkout.c.
| ︙ | ︙ | |||
171 172 173 174 175 176 177 178 179 180 181 182 183 184 |
** each character as a flag to enable writing "manifest", "manifest.uuid" or
** "manifest.tags".
*/
void manifest_to_disk(int vid){
char *zManFile;
Blob manifest;
Blob taglist;
int flg;
flg = db_get_manifest_setting();
if( flg & MFESTFLG_RAW ){
blob_zero(&manifest);
content_get(vid, &manifest);
| > | 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 |
** each character as a flag to enable writing "manifest", "manifest.uuid" or
** "manifest.tags".
*/
void manifest_to_disk(int vid){
char *zManFile;
Blob manifest;
Blob taglist;
Blob descr;
int flg;
flg = db_get_manifest_setting();
if( flg & MFESTFLG_RAW ){
blob_zero(&manifest);
content_get(vid, &manifest);
|
| ︙ | ︙ | |||
217 218 219 220 221 222 223 224 225 226 227 228 229 230 |
blob_reset(&taglist);
}else{
if( !db_exists("SELECT 1 FROM vfile WHERE pathname='manifest.tags'") ){
zManFile = mprintf("%smanifest.tags", g.zLocalRoot);
file_delete(zManFile);
free(zManFile);
}
}
}
/*
** Find the branch name and all symbolic tags for a particular check-in
** identified by "rid".
**
| > > > > > > > > > > > > > > > > > | 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 |
blob_reset(&taglist);
}else{
if( !db_exists("SELECT 1 FROM vfile WHERE pathname='manifest.tags'") ){
zManFile = mprintf("%smanifest.tags", g.zLocalRoot);
file_delete(zManFile);
free(zManFile);
}
}
if( flg & MFESTFLG_DESCR ){
CommitDescr cd;
blob_zero(&descr);
zManFile = mprintf("%smanifest.descr", g.zLocalRoot);
describe_commit(rid_to_uuid(vid), "version*", &cd);
blob_appendf(&descr, "%s-%d-%10.10s%s\n", cd.zRelTagname, cd.nCommitsSince,
cd.zCommitHash, cd.isDirty ? "-dirty" : "");
blob_write_to_file(&descr, zManFile);
free(zManFile);
blob_reset(&descr);
}else{
if( !db_exists("SELECT 1 FROM vfile WHERE pathname='manifest.descr'") ){
zManFile = mprintf("%smanifest.descr", g.zLocalRoot);
file_delete(zManFile);
free(zManFile);
}
}
}
/*
** Find the branch name and all symbolic tags for a particular check-in
** identified by "rid".
**
|
| ︙ | ︙ | |||
350 351 352 353 354 355 356 357 358 |
uncheckout(prior);
}
db_multi_exec("DELETE FROM vfile WHERE vid!=%d", vid);
if( !keepFlag ){
vfile_to_disk(vid, 0, !g.fQuiet, promptFlag);
}
checkout_set_all_exe(vid);
manifest_to_disk(vid);
ensure_empty_dirs_created(0);
| > < | 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 |
uncheckout(prior);
}
db_multi_exec("DELETE FROM vfile WHERE vid!=%d", vid);
if( !keepFlag ){
vfile_to_disk(vid, 0, !g.fQuiet, promptFlag);
}
checkout_set_all_exe(vid);
db_set_checkout(vid);
manifest_to_disk(vid);
ensure_empty_dirs_created(0);
undo_reset();
db_multi_exec("DELETE FROM vmerge");
if( !keepFlag && db_get_boolean("repo-cksum",1) ){
vfile_aggregate_checksum_manifest(vid, &cksum1, &cksum1b);
vfile_aggregate_checksum_disk(vid, &cksum2);
if( blob_compare(&cksum1, &cksum2) ){
fossil_print("WARNING: manifest checksum does not agree with disk\n");
|
| ︙ | ︙ |
Changes to src/db.c.
| ︙ | ︙ | |||
3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 |
#if INTERFACE
/* Manifest generation flags */
#define MFESTFLG_RAW 0x01
#define MFESTFLG_UUID 0x02
#define MFESTFLG_TAGS 0x04
#endif /* INTERFACE */
/*
** Get the manifest setting. For backwards compatibility first check if the
** value is a boolean. If it's not a boolean, treat each character as a flag
** to enable a manifest type. This system puts certain boundary conditions on
** which letters can be used to represent flags (any permutation of flags must
** not be able to fully form one of the boolean values).
*/
int db_get_manifest_setting(void){
int flg;
char *zVal = db_get("manifest", 0);
if( zVal==0 || is_false(zVal) ){
return 0;
}else if( is_truth(zVal) ){
| > | > | 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 |
#if INTERFACE
/* Manifest generation flags */
#define MFESTFLG_RAW 0x01
#define MFESTFLG_UUID 0x02
#define MFESTFLG_TAGS 0x04
#define MFESTFLG_DESCR 0x08
#endif /* INTERFACE */
/*
** Get the manifest setting. For backwards compatibility first check if the
** value is a boolean. If it's not a boolean, treat each character as a flag
** to enable a manifest type. This system puts certain boundary conditions on
** which letters can be used to represent flags (any permutation of flags must
** not be able to fully form one of the boolean values).
*/
int db_get_manifest_setting(void){
int flg;
char *zVal = db_get("manifest", 0);
if( zVal==0 || is_false(zVal) ){
return 0;
}else if( is_truth(zVal) ){
return MFESTFLG_RAW|MFESTFLG_UUID|MFESTFLG_DESCR;
}
flg = 0;
while( *zVal ){
switch( *zVal ){
case 'r': flg |= MFESTFLG_RAW; break;
case 'u': flg |= MFESTFLG_UUID; break;
case 't': flg |= MFESTFLG_TAGS; break;
case 'd': flg |= MFESTFLG_DESCR; break;
}
zVal++;
}
return flg;
}
|
| ︙ | ︙ | |||
4255 4256 4257 4258 4259 4260 4261 | */ /* ** SETTING: manifest width=5 versionable ** If enabled, automatically create files "manifest" and "manifest.uuid" ** in every checkout. ** ** Optionally use combinations of characters 'r' for "manifest", | | > | | 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 | */ /* ** SETTING: manifest width=5 versionable ** If enabled, automatically create files "manifest" and "manifest.uuid" ** in every checkout. ** ** Optionally use combinations of characters 'r' for "manifest", ** 'u' for "manifest.uuid", 't' for "manifest.tags", and 'd' ** for "manifest.descr". The SQLite and Fossil repositories both ** require manifests. */ /* ** SETTING: max-loadavg width=25 default=0.0 ** Some CPU-intensive web pages (ex: /zip, /tarball, /blame) ** are disallowed if the system load average goes above this ** value. "0.0" means no limit. This only works on unix. ** Only local settings of this value make a difference since |
| ︙ | ︙ |
Changes to src/export.c.
| ︙ | ︙ | |||
1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 |
if( fManifest & MFESTFLG_TAGS ){
Blob tagslist;
blob_init(&tagslist, 0, 0);
get_checkin_taglist(rid, &tagslist);
fprintf(xCmd,"M 100644 inline manifest.tags\ndata %d\n%s\n",
blob_strlen(&tagslist), blob_str(&tagslist));
blob_reset(&tagslist);
}
/* The check-in is finished, so decrement the counter */
(*pnLimit)--;
return 0;
}
| > > > > > > > > > > > | 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 |
if( fManifest & MFESTFLG_TAGS ){
Blob tagslist;
blob_init(&tagslist, 0, 0);
get_checkin_taglist(rid, &tagslist);
fprintf(xCmd,"M 100644 inline manifest.tags\ndata %d\n%s\n",
blob_strlen(&tagslist), blob_str(&tagslist));
blob_reset(&tagslist);
}
if( fManifest & MFESTFLG_DESCR ){
CommitDescr cd;
Blob descr;
blob_init(&descr, 0, 0);
describe_commit(rid_to_uuid(rid), "version*", &cd);
blob_appendf(&descr, "%s-%d-%10.10s\n", cd.zRelTagname,
cd.nCommitsSince, cd.zCommitHash);
fprintf(xCmd,"M 100644 inline manifest.descr\ndata %d\n%s\n",
blob_strlen(&descr), blob_str(&descr));
blob_reset(&descr);
}
/* The check-in is finished, so decrement the counter */
(*pnLimit)--;
return 0;
}
|
| ︙ | ︙ |
Changes to src/info.c.
| ︙ | ︙ | |||
245 246 247 248 249 250 251 |
}
fossil_print("check-ins: %d\n",
db_int(-1, "SELECT count(*) FROM event WHERE type='ci' /*scan*/"));
}
if( verboseFlag || !g.repositoryOpen ){
Blob vx;
char *z;
| | | 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 |
}
fossil_print("check-ins: %d\n",
db_int(-1, "SELECT count(*) FROM event WHERE type='ci' /*scan*/"));
}
if( verboseFlag || !g.repositoryOpen ){
Blob vx;
char *z;
fossil_version_blob(&vx, 0, 0);
z = strstr(blob_str(&vx), "version");
if( z ){
z += 8;
}else{
z = blob_str(&vx);
}
fossil_print("fossil: %z\n", file_fullexename(g.nameOfExe));
|
| ︙ | ︙ |
Changes to src/main.c.
| ︙ | ︙ | |||
1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 |
** This function returns a human readable version string.
*/
const char *get_version(){
static const char version[] = RELEASE_VERSION " " MANIFEST_VERSION " "
MANIFEST_DATE " UTC";
return version;
}
/*
** This function populates a blob with version information. It is used by
** the "version" command and "test-version" web page. It assumes the blob
** passed to it is uninitialized; otherwise, it will leak memory.
*/
void fossil_version_blob(
Blob *pOut, /* Write the manifest here */
| > > > > > > > > > > > > > > > | > | > | 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 |
** This function returns a human readable version string.
*/
const char *get_version(){
static const char version[] = RELEASE_VERSION " " MANIFEST_VERSION " "
MANIFEST_DATE " UTC";
return version;
}
/*
** This function returns a human readable version string based on 'describe'.
*/
const char *get_describe_version(){
#ifndef MANIFEST_DESCRIPTION
#define MANIFEST_DESCRIPTION MANIFEST_VERSION
#endif
#ifndef DESCRIPTION_DATE
#define DESCRIPTION_DATE MANIFEST_DATE
#endif
static const char version[] = RELEASE_VERSION " " MANIFEST_DESCRIPTION " "
DESCRIPTION_DATE " UTC";
return version;
}
/*
** This function populates a blob with version information. It is used by
** the "version" command and "test-version" web page. It assumes the blob
** passed to it is uninitialized; otherwise, it will leak memory.
*/
void fossil_version_blob(
Blob *pOut, /* Write the manifest here */
int bVerbose, /* Non-zero for full information. */
int bDescribe /* Non-zero for describe information. */
){
#if defined(FOSSIL_ENABLE_TCL)
int rc;
const char *zRc;
#endif
Stmt q;
size_t pageSize = 0;
blob_zero(pOut);
blob_appendf(pOut, "This is fossil version %s\n",
bDescribe ? get_describe_version() : get_version());
if( !bVerbose ) return;
blob_appendf(pOut, "Compiled on %s %s using %s (%d-bit)\n",
__DATE__, __TIME__, COMPILER_NAME, sizeof(void*)*8);
blob_appendf(pOut, "Schema version %s\n", AUX_SCHEMA_MAX);
fossil_get_page_size(&pageSize);
blob_appendf(pOut, "Detected memory page size is %lu bytes\n",
(unsigned long)pageSize);
|
| ︙ | ︙ | |||
1283 1284 1285 1286 1287 1288 1289 | return version; } /* ** COMMAND: version ** | | > > > > > > > > | > > | | 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 |
return version;
}
/*
** COMMAND: version
**
** Usage: %fossil version ?-v|--verbose? ?-d|--describe?
**
** Print the source code version number for the fossil executable.
** If the verbose option is specified, additional details will
** be output about what optional features this binary was compiled
** with
**
** Options:
**
** -d|--describe Show an extended description based on the latest
** tagged source code commit
** -v|--verbose Show additional details will about what optional
** features this binary was compiled with
*/
void version_cmd(void){
Blob versionInfo;
int verboseFlag = find_option("verbose","v",0)!=0;
int describeFlag = find_option("describe","d",0)!=0;
/* We should be done with options.. */
verify_all_options();
fossil_version_blob(&versionInfo, verboseFlag, describeFlag);
fossil_print("%s", blob_str(&versionInfo));
}
/*
** WEBPAGE: version
**
** Show the version information for Fossil.
**
** Query parameters:
**
** verbose Show details
*/
void test_version_page(void){
Blob versionInfo;
int verboseFlag;
int describeFlag;
login_check_credentials();
if( !g.perm.Read ){ login_needed(g.anon.Read); return; }
verboseFlag = PD("verbose", 0) != 0;
describeFlag = PD("describe", 0) != 0;
style_header("Version Information");
style_submenu_element("Stat", "stat");
fossil_version_blob(&versionInfo, verboseFlag, describeFlag);
@ <pre>
@ %h(blob_str(&versionInfo))
@ </pre>
style_finish_page();
}
|
| ︙ | ︙ |
Changes to src/main.mk.
| ︙ | ︙ | |||
612 613 614 615 616 617 618 | # # TESTFLAGS can also include names of specific test files to limit # the run to just those test cases. # test: $(OBJDIR) $(APPNAME) $(TCLSH) $(SRCDIR)/../test/tester.tcl $(APPNAME) $(TESTFLAGS) | | | > | 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 |
#
# TESTFLAGS can also include names of specific test files to limit
# the run to just those test cases.
#
test: $(OBJDIR) $(APPNAME)
$(TCLSH) $(SRCDIR)/../test/tester.tcl $(APPNAME) $(TESTFLAGS)
$(OBJDIR)/VERSION.h: $(SRCDIR)/../manifest.uuid $(SRCDIR)/../manifest $(SRCDIR)/../VERSION $(SRCDIR)/../manifest.descr $(OBJDIR)/mkversion $(OBJDIR)/phony.h
$(OBJDIR)/mkversion $(SRCDIR)/../manifest.uuid \
$(SRCDIR)/../manifest \
$(SRCDIR)/../VERSION \
$(SRCDIR)/../manifest.descr >$(OBJDIR)/VERSION.h
$(OBJDIR)/phony.h:
# Force rebuild of VERSION.h every time we run "make"
# Setup the options used to compile the included SQLite library.
SQLITE_OPTIONS = -DNDEBUG=1 \
-DSQLITE_DQS=0 \
|
| ︙ | ︙ |
Changes to src/tar.c.
| ︙ | ︙ | |||
514 515 516 517 518 519 520 |
eflg |= MFESTFLG_UUID;
}
if( (pInclude==0 || glob_match(pInclude, "manifest.tags"))
&& !glob_match(pExclude, "manifest.tags")
&& (flg & MFESTFLG_TAGS) ){
eflg |= MFESTFLG_TAGS;
}
| > > > > | | | 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 |
eflg |= MFESTFLG_UUID;
}
if( (pInclude==0 || glob_match(pInclude, "manifest.tags"))
&& !glob_match(pExclude, "manifest.tags")
&& (flg & MFESTFLG_TAGS) ){
eflg |= MFESTFLG_TAGS;
}
if( (pInclude==0 || glob_match(pInclude, "manifest.descr"))
&& !glob_match(pExclude, "manifest.descr")
&& (flg & MFESTFLG_DESCR) ){
eflg |= MFESTFLG_DESCR;
}
if( eflg & (MFESTFLG_RAW|MFESTFLG_UUID|MFESTFLG_DESCR) ){
if( eflg & MFESTFLG_RAW ){
blob_append(&filename, "manifest", -1);
zName = blob_str(&filename);
if( listFlag ) fossil_print("%s\n", zName);
if( pTar ){
tar_add_file(zName, &mfile, 0, mTime);
}
|
| ︙ | ︙ | |||
548 549 550 551 552 553 554 555 556 557 558 559 560 561 |
if( pTar ){
Blob tagslist;
blob_zero(&tagslist);
get_checkin_taglist(rid, &tagslist);
tar_add_file(zName, &tagslist, 0, mTime);
blob_reset(&tagslist);
}
}
}
manifest_file_rewind(pManifest);
while( (pFile = manifest_file_next(pManifest,0))!=0 ){
int fid;
if( pInclude!=0 && !glob_match(pInclude, pFile->zName) ) continue;
if( glob_match(pExclude, pFile->zName) ) continue;
| > > > > > > > > > > > > > > > > | 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 |
if( pTar ){
Blob tagslist;
blob_zero(&tagslist);
get_checkin_taglist(rid, &tagslist);
tar_add_file(zName, &tagslist, 0, mTime);
blob_reset(&tagslist);
}
}
if( eflg & MFESTFLG_DESCR ){
blob_resize(&filename, nPrefix);
blob_append(&filename, "manifest.descr", -1);
zName = blob_str(&filename);
if( listFlag ) fossil_print("%s\n", zName);
if( pTar ){
CommitDescr cd;
Blob descr;
blob_zero(&descr);
describe_commit(rid_to_uuid(rid), "version*", &cd);
blob_appendf(&descr, "%s-%d-%10.10s\n", cd.zRelTagname,
cd.nCommitsSince, cd.zCommitHash);
tar_add_file(zName, &descr, 0, mTime);
blob_reset(&descr);
}
}
}
manifest_file_rewind(pManifest);
while( (pFile = manifest_file_next(pManifest,0))!=0 ){
int fid;
if( pInclude!=0 && !glob_match(pInclude, pFile->zName) ) continue;
if( glob_match(pExclude, pFile->zName) ) continue;
|
| ︙ | ︙ |
Changes to src/update.c.
| ︙ | ︙ | |||
624 625 626 627 628 629 630 |
g.zLocalRoot, g.zLocalRoot, zPwd
);
fossil_free(zPwd);
if( g.argc<=3 ){
/* All files updated. Shift the current checkout to the target. */
db_multi_exec("DELETE FROM vfile WHERE vid!=%d", tid);
checkout_set_all_exe(tid);
| < > | 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 |
g.zLocalRoot, g.zLocalRoot, zPwd
);
fossil_free(zPwd);
if( g.argc<=3 ){
/* All files updated. Shift the current checkout to the target. */
db_multi_exec("DELETE FROM vfile WHERE vid!=%d", tid);
checkout_set_all_exe(tid);
db_set_checkout(tid);
manifest_to_disk(tid);
}else{
/* A subset of files have been checked out. Keep the current
** checkout unchanged. */
db_multi_exec("DELETE FROM vfile WHERE vid!=%d", vid);
}
if( !internalUpdate ) undo_finish();
if( setmtimeFlag ) vfile_check_signature(tid, CKSIG_SETMTIME);
|
| ︙ | ︙ |
Changes to src/zip.c.
| ︙ | ︙ | |||
668 669 670 671 672 673 674 |
eflg |= MFESTFLG_UUID;
}
if( (pInclude==0 || glob_match(pInclude, "manifest.tags"))
&& !glob_match(pExclude, "manifest.tags")
&& (flg & MFESTFLG_TAGS) ){
eflg |= MFESTFLG_TAGS;
}
| > > > > | | 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 |
eflg |= MFESTFLG_UUID;
}
if( (pInclude==0 || glob_match(pInclude, "manifest.tags"))
&& !glob_match(pExclude, "manifest.tags")
&& (flg & MFESTFLG_TAGS) ){
eflg |= MFESTFLG_TAGS;
}
if( (pInclude==0 || glob_match(pInclude, "manifest.descr"))
&& !glob_match(pExclude, "manifest.descr")
&& (flg & MFESTFLG_DESCR) ){
eflg |= MFESTFLG_DESCR;
}
if( eflg & MFESTFLG_RAW ){
blob_append(&filename, "manifest", -1);
zName = blob_str(&filename);
if( listFlag ) fossil_print("%s\n", zName);
if( pZip ){
zip_add_folders(&sArchive, zName);
zip_add_file(&sArchive, zName, &mfile, 0);
|
| ︙ | ︙ | |||
702 703 704 705 706 707 708 709 710 711 712 713 714 715 |
Blob tagslist;
blob_zero(&tagslist);
get_checkin_taglist(rid, &tagslist);
zip_add_folders(&sArchive, zName);
zip_add_file(&sArchive, zName, &tagslist, 0);
blob_reset(&tagslist);
}
}
}
manifest_file_rewind(pManifest);
if( pZip ) zip_add_file(&sArchive, "", 0, 0);
while( (pFile = manifest_file_next(pManifest,0))!=0 ){
int fid;
if( pInclude!=0 && !glob_match(pInclude, pFile->zName) ) continue;
| > > > > > > > > > > > > > > > > > | 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 |
Blob tagslist;
blob_zero(&tagslist);
get_checkin_taglist(rid, &tagslist);
zip_add_folders(&sArchive, zName);
zip_add_file(&sArchive, zName, &tagslist, 0);
blob_reset(&tagslist);
}
}
if( eflg & MFESTFLG_DESCR ){
blob_resize(&filename, nPrefix);
blob_append(&filename, "manifest.descr", -1);
zName = blob_str(&filename);
if( listFlag ) fossil_print("%s\n", zName);
if( pZip ){
CommitDescr cd;
Blob descr;
blob_zero(&descr);
describe_commit(rid_to_uuid(rid), "version*", &cd);
blob_appendf(&descr, "%s-%d-%10.10s\n", cd.zRelTagname,
cd.nCommitsSince, cd.zCommitHash);
zip_add_folders(&sArchive, zName);
zip_add_file(&sArchive, zName, &descr, 0);
blob_reset(&descr);
}
}
}
manifest_file_rewind(pManifest);
if( pZip ) zip_add_file(&sArchive, "", 0, 0);
while( (pFile = manifest_file_next(pManifest,0))!=0 ){
int fid;
if( pInclude!=0 && !glob_match(pInclude, pFile->zName) ) continue;
|
| ︙ | ︙ |
Changes to tools/makemake.tcl.
| ︙ | ︙ | |||
399 400 401 402 403 404 405 | # # TESTFLAGS can also include names of specific test files to limit # the run to just those test cases. # test: $(OBJDIR) $(APPNAME) $(TCLSH) $(SRCDIR)/../test/tester.tcl $(APPNAME) $(TESTFLAGS) | | | > | 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 | # # TESTFLAGS can also include names of specific test files to limit # the run to just those test cases. # test: $(OBJDIR) $(APPNAME) $(TCLSH) $(SRCDIR)/../test/tester.tcl $(APPNAME) $(TESTFLAGS) $(OBJDIR)/VERSION.h: $(SRCDIR)/../manifest.uuid $(SRCDIR)/../manifest $(SRCDIR)/../VERSION $(SRCDIR)/../manifest.descr $(OBJDIR)/mkversion $(OBJDIR)/phony.h $(OBJDIR)/mkversion $(SRCDIR)/../manifest.uuid <<<NEXT_LINE>>> $(SRCDIR)/../manifest <<<NEXT_LINE>>> $(SRCDIR)/../VERSION <<<NEXT_LINE>>> $(SRCDIR)/../manifest.descr >$(OBJDIR)/VERSION.h $(OBJDIR)/phony.h: # Force rebuild of VERSION.h every time we run "make" # Setup the options used to compile the included SQLite library. SQLITE_OPTIONS = <<<SQLITE_OPTIONS>>> |
| ︙ | ︙ | |||
1085 1086 1087 1088 1089 1090 1091 | # WARNING. DANGER. Running the test suite modifies the repository the # build is done from, i.e. the checkout belongs to. Do not sync/push # the repository after running the tests. test: $(OBJDIR) $(APPNAME) $(TCLSH) $(SRCDIR)/../test/tester.tcl $(APPNAME) | | | | 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 | # WARNING. DANGER. Running the test suite modifies the repository the # build is done from, i.e. the checkout belongs to. Do not sync/push # the repository after running the tests. test: $(OBJDIR) $(APPNAME) $(TCLSH) $(SRCDIR)/../test/tester.tcl $(APPNAME) $(OBJDIR)/VERSION.h: $(SRCDIR)/../manifest.uuid $(SRCDIR)/../manifest $(MKVERSION) $(SRCDIR)/../manifest.descr $(OBJDIR)/phony.h $(MKVERSION) $(SRCDIR)/../manifest.uuid $(SRCDIR)/../manifest $(SRCDIR)/../VERSION $(SRCDIR)/../manifest.descr >$@ $(OBJDIR)/phony.h: # Force rebuild of VERSION.h every time "make" is run # The USE_SYSTEM_SQLITE variable may be undefined, set to 0 or 1. # If it is set to 1, then there is no need to build or link # the sqlite3.o object. Instead, the system SQLite will be linked |
| ︙ | ︙ | |||
1390 1391 1392 1393 1394 1395 1396 | $(OBJDIR)\th_lang$O : $(SRCDIR)\th_lang.c $(TCC) -o$@ -c $** $(OBJDIR)\cson_amalgamation.h : $(SRCDIR_extsrc)\cson_amalgamation.h cp $@ $@ | | | 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 | $(OBJDIR)\th_lang$O : $(SRCDIR)\th_lang.c $(TCC) -o$@ -c $** $(OBJDIR)\cson_amalgamation.h : $(SRCDIR_extsrc)\cson_amalgamation.h cp $@ $@ VERSION.h : mkversion$E $B\manifest.uuid $B\manifest $B\VERSION $B\manifest.descr +$** > $@ page_index.h: mkindex$E $(SRC) +$** > $@ builtin_data.h: mkbuiltin$E $(EXTRA_FILES) mkbuiltin$E --prefix $(SRCDIR)/ $(EXTRA_FILES) > $@ |
| ︙ | ︙ | |||
1948 1949 1950 1951 1952 1953 1954 | "$(OX)\th_tcl$O" : "$(SRCDIR)\th_tcl.c" $(TCC) /Fo$@ /Fd$(@D)\ -c $** "$(OX)\pikchr$O" : "$(SRCDIR_extsrc)\pikchr.c" $(TCC) /Fo$@ /Fd$(@D)\ -c $** | | | | 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 | "$(OX)\th_tcl$O" : "$(SRCDIR)\th_tcl.c" $(TCC) /Fo$@ /Fd$(@D)\ -c $** "$(OX)\pikchr$O" : "$(SRCDIR_extsrc)\pikchr.c" $(TCC) /Fo$@ /Fd$(@D)\ -c $** "$(OX)\VERSION.h" : "$(OBJDIR)\mkversion$E" "$(B)\manifest.uuid" "$(B)\manifest" "$(B)\VERSION" "$(B)\manifest.descr" "$(B)\phony.h" "$(OBJDIR)\mkversion$E" "$(B)\manifest.uuid" "$(B)\manifest" "$(B)\VERSION" "$(B)\manifest.descr" > $@ "$(B)\phony.h" : rem Force rebuild of VERSION.h whenever nmake is run "$(OX)\cson_amalgamation$O" : "$(SRCDIR_extsrc)\cson_amalgamation.c" $(TCC) /Fo$@ /Fd$(@D)\ -c $** |
| ︙ | ︙ |
Changes to tools/mkversion.c.
1 2 | /* ** This C program generates the "VERSION.h" header file from information | | > | | > | > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | /* ** This C program generates the "VERSION.h" header file from information ** extracted out of the "manifest", "manifest.uuid", "VERSION", and ** optionally "manifest.descr" files. ** Call this program with three or four arguments: ** ** ./a.out manifest.uuid manifest VERSION ?manifest.descr? ** ** Note that the manifest.uuid, manifest, and manifest.descr files are ** generated by Fossil. ** ** The output becomes the "VERSION.h" file. The output is a C-language ** header that contains #defines for various properties of the build: ** ** MANIFEST_UUID These values are text strings that ** MANIFEST_VERSION identify the Fossil check-in to which ** the source tree belongs. They do not ** take into account any uncommitted edits. ** MANIFEST_DESCRIPTION This value gives a description relative to ** the youngest tagged ancestor and takes into ** account possilbe uncommitted edits. ** ** FOSSIL_BUILD_HASH A hexadecimal string that is a strong hash ** of the MANIFEST_UUID together with the ** current time of the build. We normally want ** this to be different on each build, as the ** value is used to expire ETag: fields in ** HTTP requests. But if you need to do ** repeatable byte-for-byte identical builds, ** add the -DFOSSIL_BUILD_EPOCH=n option. ** ** MANIFEST_DATE The date/time of the source-code check-in ** MANIFEST_YEAR in various formats. ** MANIFEST_NUMERIC_DATE ** MANIFEST_NUMERIC_TIME ** DESCRIPTION_DATE ** ** RELEASE_VERSION The version number (from the VERSION source ** RELEASE_VERSION_NUMBER file) in various format. ** RELEASE_RESOURCE_VERSION ** ** New #defines may be added in the future. */ |
| ︙ | ︙ | |||
91 92 93 94 95 96 97 |
int i = 0;
#endif
int j = 0, x = 0, d = 0;
size_t n;
int vn[3];
char b[1000];
char vx[1000];
| | | | 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
int i = 0;
#endif
int j = 0, x = 0, d = 0;
size_t n;
int vn[3];
char b[1000];
char vx[1000];
if( argc!=4 && argc!=5 ){
fprintf(stderr, "Usage: %s manifest.uuid manifest VERSION [manifest.descr]\n", argv[0]);
exit(1);
}
memset(b,0,sizeof(b));
memset(vx,0,sizeof(vx));
u = open_for_reading(argv[1]);
if( fgets(b, sizeof(b)-1,u)==0 ){
fprintf(stderr, "malformed manifest.uuid file: %s\n", argv[1]);
|
| ︙ | ︙ | |||
188 189 190 191 192 193 194 195 196 197 198 199 200 201 |
z[0] = '\0';
break;
}
}
printf("#define RELEASE_RESOURCE_VERSION %s", vx);
while( d<3 ){ printf(",0"); d++; }
printf("\n");
#if defined(__DMC__) /* e.g. 0x857 */
d = (__DMC__ & 0xF00) >> 8; /* major */
x = (__DMC__ & 0x0F0) >> 4; /* minor */
i = (__DMC__ & 0x00F); /* revision */
printf("#define COMPILER_VERSION \"%d.%d.%d\"\n", d, x, i);
#elif defined(__POCC__) /* e.g. 700 */
d = (__POCC__ / 100); /* major */
| > > > > > > > > > > > > > > > > > > | 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 |
z[0] = '\0';
break;
}
}
printf("#define RELEASE_RESOURCE_VERSION %s", vx);
while( d<3 ){ printf(",0"); d++; }
printf("\n");
FILE *dd = fopen(argv[4], "r");
if( dd!=0 ){
if( fgets(b, sizeof(b)-1,dd) ){
for(z=b; z[0] && z[0]!='\r' && z[0]!='\n'; z++){}
*z = 0;
printf("#define MANIFEST_DESCRIPTION \"[%s]\"\n",b);
if( strstr(b, "dirty") ){
/* If dirty, use current time. Another option would be
to use the latest mtime among the modified files. */
time_t now = time(0);
struct tm* tm_now = gmtime(&now);
char zNow[20];
strftime(zNow, sizeof(zNow), "%Y-%m-%d %H:%M:%S", tm_now);
printf("#define DESCRIPTION_DATE \"%s\"\n", zNow);
}
}
fclose(dd);
}
#if defined(__DMC__) /* e.g. 0x857 */
d = (__DMC__ & 0xF00) >> 8; /* major */
x = (__DMC__ & 0x0F0) >> 4; /* minor */
i = (__DMC__ & 0x00F); /* revision */
printf("#define COMPILER_VERSION \"%d.%d.%d\"\n", d, x, i);
#elif defined(__POCC__) /* e.g. 700 */
d = (__POCC__ / 100); /* major */
|
| ︙ | ︙ |
Changes to win/Makefile.dmc.
| ︙ | ︙ | |||
89 90 91 92 93 94 95 | $(OBJDIR)\th_lang$O : $(SRCDIR)\th_lang.c $(TCC) -o$@ -c $** $(OBJDIR)\cson_amalgamation.h : $(SRCDIR_extsrc)\cson_amalgamation.h cp $@ $@ | | | 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | $(OBJDIR)\th_lang$O : $(SRCDIR)\th_lang.c $(TCC) -o$@ -c $** $(OBJDIR)\cson_amalgamation.h : $(SRCDIR_extsrc)\cson_amalgamation.h cp $@ $@ VERSION.h : mkversion$E $B\manifest.uuid $B\manifest $B\VERSION $B\manifest.descr +$** > $@ page_index.h: mkindex$E $(SRC) +$** > $@ builtin_data.h: mkbuiltin$E $(EXTRA_FILES) mkbuiltin$E --prefix $(SRCDIR)/ $(EXTRA_FILES) > $@ |
| ︙ | ︙ |
Changes to win/Makefile.mingw.
| ︙ | ︙ | |||
1047 1048 1049 1050 1051 1052 1053 | # WARNING. DANGER. Running the test suite modifies the repository the # build is done from, i.e. the checkout belongs to. Do not sync/push # the repository after running the tests. test: $(OBJDIR) $(APPNAME) $(TCLSH) $(SRCDIR)/../test/tester.tcl $(APPNAME) | | | | 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 | # WARNING. DANGER. Running the test suite modifies the repository the # build is done from, i.e. the checkout belongs to. Do not sync/push # the repository after running the tests. test: $(OBJDIR) $(APPNAME) $(TCLSH) $(SRCDIR)/../test/tester.tcl $(APPNAME) $(OBJDIR)/VERSION.h: $(SRCDIR)/../manifest.uuid $(SRCDIR)/../manifest $(MKVERSION) $(SRCDIR)/../manifest.descr $(OBJDIR)/phony.h $(MKVERSION) $(SRCDIR)/../manifest.uuid $(SRCDIR)/../manifest $(SRCDIR)/../VERSION $(SRCDIR)/../manifest.descr >$@ $(OBJDIR)/phony.h: # Force rebuild of VERSION.h every time "make" is run # The USE_SYSTEM_SQLITE variable may be undefined, set to 0 or 1. # If it is set to 1, then there is no need to build or link # the sqlite3.o object. Instead, the system SQLite will be linked |
| ︙ | ︙ |
Changes to win/Makefile.mingw.mistachkin.
| ︙ | ︙ | |||
1047 1048 1049 1050 1051 1052 1053 | # WARNING. DANGER. Running the test suite modifies the repository the # build is done from, i.e. the checkout belongs to. Do not sync/push # the repository after running the tests. test: $(OBJDIR) $(APPNAME) $(TCLSH) $(SRCDIR)/../test/tester.tcl $(APPNAME) | | | | 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 | # WARNING. DANGER. Running the test suite modifies the repository the # build is done from, i.e. the checkout belongs to. Do not sync/push # the repository after running the tests. test: $(OBJDIR) $(APPNAME) $(TCLSH) $(SRCDIR)/../test/tester.tcl $(APPNAME) $(OBJDIR)/VERSION.h: $(SRCDIR)/../manifest.uuid $(SRCDIR)/../manifest $(MKVERSION) $(SRCDIR)/../manifest.descr $(OBJDIR)/phony.h $(MKVERSION) $(SRCDIR)/../manifest.uuid $(SRCDIR)/../manifest $(SRCDIR)/../VERSION $(SRCDIR)/../manifest.descr >$@ $(OBJDIR)/phony.h: # Force rebuild of VERSION.h every time "make" is run # The USE_SYSTEM_SQLITE variable may be undefined, set to 0 or 1. # If it is set to 1, then there is no need to build or link # the sqlite3.o object. Instead, the system SQLite will be linked |
| ︙ | ︙ |
Changes to win/Makefile.msc.
| ︙ | ︙ | |||
1060 1061 1062 1063 1064 1065 1066 | "$(OX)\th_tcl$O" : "$(SRCDIR)\th_tcl.c" $(TCC) /Fo$@ /Fd$(@D)\ -c $** "$(OX)\pikchr$O" : "$(SRCDIR_extsrc)\pikchr.c" $(TCC) /Fo$@ /Fd$(@D)\ -c $** | | | | 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 | "$(OX)\th_tcl$O" : "$(SRCDIR)\th_tcl.c" $(TCC) /Fo$@ /Fd$(@D)\ -c $** "$(OX)\pikchr$O" : "$(SRCDIR_extsrc)\pikchr.c" $(TCC) /Fo$@ /Fd$(@D)\ -c $** "$(OX)\VERSION.h" : "$(OBJDIR)\mkversion$E" "$(B)\manifest.uuid" "$(B)\manifest" "$(B)\VERSION" "$(B)\manifest.descr" "$(B)\phony.h" "$(OBJDIR)\mkversion$E" "$(B)\manifest.uuid" "$(B)\manifest" "$(B)\VERSION" "$(B)\manifest.descr" > $@ "$(B)\phony.h" : rem Force rebuild of VERSION.h whenever nmake is run "$(OX)\cson_amalgamation$O" : "$(SRCDIR_extsrc)\cson_amalgamation.c" $(TCC) /Fo$@ /Fd$(@D)\ -c $** |
| ︙ | ︙ |