@@ -19,11 +19,11 @@
19 19 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** [email protected]
20 20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** http://www.hwaci.com/drh/
21 21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
22 22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*******************************************************************************
23 23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** This file contains code used to check-out versions of the project
24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This file contains code used to check-in versions of the project
25 25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** from the local repository.
26 26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
27 27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include "config.h"
28 28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include "checkin.h"
29 29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include <assert.h>
@@ -560,5 +560,258 @@
560 560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
561 561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
printf("Warning: commit caused a fork to occur. Please merge and push\n");
562 562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
printf(" your changes as soon as possible.\n");
563 563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
564 564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** COMMAND: test-import-manifest
568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Usage: %fossil test-import-manifest DATE COMMENT ?-p PARENT_RECORDID?... ?-f (FILE_RECORDID PATH)?...
570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Create a new version containing containing the specified file
572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** revisions (if any), and child of the given PARENT version.
573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void import_manifest_cmd(void){
575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char* zDate; /* argument - timestamp, as seconds since epoch (int) */
576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char* zComment; /* argument - manifest comment */
577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char* zDateFmt; /* timestamp formatted for the manifest */
578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int* zParents; /* arguments - array of parent references */
579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int zParentCount; /* number of found parent references */
580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob manifest; /* container for the manifest to be generated */
581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob mcksum; /* Self-checksum on the manifest */
582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob cksum, cksum2; /* Before and after commit checksums */
583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob cksum1b; /* Checksum recorded in the manifest */
584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char* parent; /* loop variable when collecting parent references */
585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i, mid; /* Another loop index, and id of new manifest */
586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Stmt q; /* sql statement to query table of files */
587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define USAGE ("DATE COMMENT ?-p|-parent PARENT_RID...? ?-f|-file (FILE_RID PATH)...?")
589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Validate and process arguments, collect information.
592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_must_be_within_tree();
595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Mandatory arguments */
597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if (g.argc < 4) {
598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ usage (USAGE);
599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zDate = g.argv[2];
602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zComment = g.argv[3];
603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ remove_from_argv (2,2);
605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Pull the optional parent arguments
607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Note: In principle it is possible that the loop below extracts
609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the wrong arguments, if we ever try to import a file whose path
610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** starts with -p/-parent. In that case however the removal of two
611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** arguments will leave the file bereft of an argument and the
612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** recheck of the number of arguments below should catch that.
613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** For a test command this is acceptable, it won't have lots of
615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** safety nets.
616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zParentCount = 0;
619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zParents = (int*)malloc(sizeof(int)*(1+g.argc));
620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* 1+, to be ok with the default even if no arguments around */
621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while ((parent = find_option("parent","p",1)) != NULL) {
623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Check and store ... */
624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zParents [zParentCount] = name_to_rid (parent);
625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zParentCount ++;
626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Fall back to the root manifest as parent if none were specified
630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** explicitly.
631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if (!zParentCount) {
634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zParents [zParentCount] = 1; /* HACK: rid 1 is the baseline manifest
635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** which was entered when the repository
636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** was created via 'new'. It always has
637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** rid 1.
638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zParentCount ++;
640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Pull the file arguments, at least one has to be present. They are
643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the only things we can have here, now, and they are triples of
644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** '-f FID PATH', so use of find_option is out, and we can check the
645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** number of arguments.
646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Note: We store the data in a temp. table, so that we later can
648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** pull it sorted, and also easily get the associated hash
649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** identifiers.
650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Note 2: We expect at least one file, otherwise the manifest won't
652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** be recognized as a baseline by the manifest parser.
653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if (((g.argc-2) % 3 != 0) || (g.argc < 5)) {
656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ usage (USAGE);
657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_begin_transaction();
660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec ("CREATE TEMP TABLE __im ("
661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "rid INTEGER PRIMARY KEY,"
662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "pathname TEXT NOT NULL)" );
663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while (g.argc > 2) {
665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Check and store ... */
666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if (strcmp("-f", g.argv[2]) &&
667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ strcmp("-file",g.argv[2])) {
668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ usage (USAGE);
669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* DANGER The %s for the path might lead itself to an injection
672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** attack. For now (i.e. testing) this is ok, but do something
673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** better in the future.
674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec("INSERT INTO __im VALUES(%d,'%s')",
677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ name_to_rid (g.argv[3]), g.argv[4] );
678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ remove_from_argv (2,3);
679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ verify_all_options();
682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Determine the user the manifest will belong to, and check that
685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** this user exists.
686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ user_select();
689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !db_exists("SELECT 1 FROM user WHERE login=%Q", g.zLogin) ){
690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("no such user: %s", g.zLogin);
691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Now generate the manifest in memory.
695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Start with comment and date. The latter is converted to the
697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** proper format before insertion.
698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_zero(&manifest);
701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if (!strlen(zComment)) {
703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&manifest, "C %F\n", "(no comment)");
704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } else {
705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&manifest, "C %F\n", blob_str(&comment));
706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zDateFmt = db_text(0, "SELECT datetime(%Q,'unixepoch')",zDate);
709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zDateFmt[10] = 'T';
710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&manifest, "D %s\n", zDateFmt);
711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ free(zDateFmt);
712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Follow with all the collected files, properly sorted. Here were
715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** also compute the checksum over the files (paths, sizes,
716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** contents), similar to what 'vfile_aggregate_checksum_repository'
717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** does.
718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ md5sum_init();
721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_prepare(&q,
722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "SELECT pathname, uuid, __im.rid"
723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " FROM __im JOIN blob ON __im.rid=blob.rid"
724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " ORDER BY 1");
725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( db_step(&q)==SQLITE_ROW ){
727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char zBuf[100];
728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob file;
729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zName = db_column_text(&q, 0);
730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zUuid = db_column_text(&q, 1);
731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int zRid = db_column_int (&q, 2);
732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Extend the manifest */
734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&manifest, "F %F %s\n", zName, zUuid);
735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Update the checksum */
737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ md5sum_step_text(zName, -1);
738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_zero(&file);
739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ content_get(zRid, &file);
740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sprintf(zBuf, " %d\n", blob_size(&file));
741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ md5sum_step_text(zBuf, -1);
742 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ md5sum_step_blob(&file);
743 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&file);
744 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
745 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_finalize(&q);
746 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ md5sum_finish (&cksum);
747 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Follow with all the specified parents. We know that there is at
750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** least one.
751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&manifest, "P");
754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for (i=0;i<zParentCount;i++) {
755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char* zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", zParents [i]);
756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&manifest, " %s", zUuid);
757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ free(zUuid);
758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&manifest, "\n");
760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Complete the manifest with user name and the various checksums
763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&manifest, "R %b\n", &cksum);
766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&manifest, "U %F\n", g.zLogin);
767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ md5sum_blob(&manifest, &mcksum);
768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&manifest, "Z %b\n", &mcksum);
769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Now insert the new manifest, try to compress it relative to first
772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** parent (primary).
773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*blob_write_to_file (&manifest, "TEST_MANIFEST");*/
776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mid = content_put(&manifest, 0, 0);
778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( mid==0 ){
779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_panic("trouble committing manifest: %s", g.zErrMsg);
780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ content_deltify(zParents[0], mid, 0);
783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Verify that the repository checksum matches the expected checksum
785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** calculated before the checkin started (and stored as the R record
786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** of the manifest file).
787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ vfile_aggregate_checksum_manifest(mid, &cksum2, &cksum1b);
790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( blob_compare(&cksum, &cksum1b) ){
791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_panic("manifest checksum does not agree with manifest: "
792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "%b versus %b", &cksum, &cksum1b);
793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( blob_compare(&cksum, &cksum2) ){
795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_panic("tree checksum does not match manifest after commit: "
796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "%b versus %b", &cksum, &cksum2);
797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
799 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
800 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** At last commit all changes, after getting rid of the temp
801 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** holder for the files, and release allocated memory.
802 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
803 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
804 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec("DROP TABLE __im");
805 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_end_transaction(0);
806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ free(zParents);
807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
809 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** At the very last inform the caller about the id of the new
810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** manifest.
811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ printf("inserted as record %d\n", mid);
814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return;
815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #undef USAGE
817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
565 818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!