@@ -713,10 +713,81 @@
713 713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_read_from_file(&file, zFullpath, ExtFILE);
714 714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = contains_merge_marker(&file);
715 715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&file);
716 716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
717 717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
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!
+ ** Show merge output in a Tcl/Tk window, in response to the --tk option
721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to the "merge" or "3-way-merge" command.
722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If fossil has direct access to a Tcl interpreter (either loaded
724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** dynamically through stubs or linked in statically), we can use it
725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** directly. Otherwise:
726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** (1) Write the Tcl/Tk script used for rendering into a temp file.
727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** (2) Invoke "tclsh" on the temp file using fossil_system().
728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** (3) Delete the temp file.
729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void merge_tk(const char *zSubCmd, int firstArg){
731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob script;
733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zTempFile = 0;
734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zCmd;
735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zTclsh;
736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bDarkMode = find_option("dark",0,0)!=0;
737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_zero(&script);
738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&script, "set fossilcmd {| \"%/\" %s -tcl",
739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.nameOfExe, zSubCmd);
740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ find_option("tcl",0,0);
741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ find_option("debug",0,0);
742 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zTclsh = find_option("tclsh",0,1);
743 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zTclsh==0 ){
744 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zTclsh = db_get("tclsh",0);
745 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
746 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* The undocumented --script FILENAME option causes the Tk script to
747 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** be written into the FILENAME instead of being run. This is used
748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** for testing and debugging. */
749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zTempFile = find_option("script",0,1);
750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=firstArg; i<g.argc; i++){
751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *z = g.argv[i];
752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sqlite3_strglob("*}*",z) ){
753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&script, " {%/}", z);
754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int j;
756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&script, " ", 1);
757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(j=0; z[j]; j++) blob_appendf(&script, "\\%03o", (unsigned char)z[j]);
758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&script, "}\nset darkmode %d\n", bDarkMode);
761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&script, "%s", builtin_file("merge.tcl", 0));
762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zTempFile ){
763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_write_to_file(&script, zTempFile);
764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("To see the merge, run: %s \"%s\"\n", zTclsh, zTempFile);
765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if defined(FOSSIL_ENABLE_TCL)
767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Th_FossilInit(TH_INIT_DEFAULT);
768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( evaluateTclWithEvents(g.interp, &g.tcl, blob_str(&script),
769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_size(&script), 1, 1, 0)==TCL_OK ){
770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&script);
771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return;
772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * If evaluation of the Tcl script fails, the reason may be that Tk
775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * could not be found by the loaded Tcl, or that Tcl cannot be loaded
776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * dynamically (e.g. x64 Tcl with x86 Fossil). Therefore, fallback
777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * to using the external "tclsh", if available.
778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zTempFile = write_blob_to_temp_file(&script);
781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zCmd = mprintf("%$ %$", zTclsh, zTempFile);
782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_system(zCmd);
783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ file_delete(zTempFile);
784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_free(zCmd);
785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&script);
787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
718 789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
719 790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
720 791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** COMMAND: 3-way-merge*
721 792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
722 793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Usage: %fossil 3-way-merge BASELINE V1 V2 [MERGED]
@@ -746,18 +817,22 @@
746 817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
747 818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void merge_3way_cmd(void){
748 819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
MergeBuilder s;
749 820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nConflict;
750 821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob pivot, v1, v2, out;
822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int noWarn = 0;
823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int flagTk = 0;
751 824 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
752 825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
mergebuilder_init_text(&s);
753 826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( find_option("debug", 0, 0) ){
754 827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
mergebuilder_init(&s);
755 828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
756 829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( find_option("tcl", 0, 0) ){
757 830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
mergebuilder_init_tcl(&s);
831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ noWarn = 1;
758 832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ flagTk = find_option("tk", 0, 0);
759 834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_zero(&pivot); s.pPivot = &pivot;
760 835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_zero(&v1); s.pV1 = &v1;
761 836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_zero(&v2); s.pV2 = &v2;
762 837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_zero(&out); s.pOut = &out;
763 838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -764,10 +839,18 @@
764 839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* We should be done with options.. */
765 840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
verify_all_options();
766 841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
767 842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.argc!=6 && g.argc!=5 ){
768 843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
usage("[OPTIONS] PIVOT V1 V2 [MERGED]");
844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( flagTk ){
846 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.argc==6 ){
847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("Cannot use an output file (\"%s\") with the --tk option",
848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.argv[5]);
849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ merge_tk("3-way-merge", 2);
851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return;
769 852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
770 853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( blob_read_from_file(s.pPivot, g.argv[2], ExtFILE)<0 ){
771 854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_fatal("cannot read %s", g.argv[2]);
772 855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
773 856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( blob_read_from_file(s.pV1, g.argv[3], ExtFILE)<0 ){
@@ -785,11 +868,13 @@
785 868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
s.xDestroy(&s);
786 869 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&pivot);
787 870 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&v1);
788 871 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&v2);
789 872 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&out);
790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( nConflict>0 ) fossil_warning("WARNING: %d merge conflicts", nConflict);
873 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nConflict>0 && !noWarn ){
874 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_warning("WARNING: %d merge conflicts", nConflict);
875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
791 876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
792 877 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
793 878 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
794 879 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** aSubst is an array of string pairs. The first element of each pair is
795 880 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** a string that begins with %. The second element is a replacement for that
796 881 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!