@@ -28,10 +28,17 @@
28 28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include <unistd.h>
29 29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include <string.h>
30 30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include <errno.h>
31 31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include "file.h"
32 32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** On Windows, include the Platform SDK header file.
35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef _WIN32
37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # include <windows.h>
38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
33 40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
34 41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The file status information from the most recent stat() call.
35 42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
36 43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Use _stati64 rather than stat on windows, in order to handle files
37 44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** larger than 2GB.
@@ -609,15 +616,35 @@
609 616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Remove all /./ path elements.
610 617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Convert /A/../ to just /
611 618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
612 619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void file_canonical_name(const char *zOrigName, Blob *pOut){
613 620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( file_is_absolute_path(zOrigName) ){
621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if defined(_WIN32)
622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zOut;
623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
614 624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_set(pOut, zOrigName);
615 625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_materialize(pOut);
626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if defined(_WIN32)
627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** On Windows, normalize the drive letter to upper case.
629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zOut = blob_str(pOut);
631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fossil_isalpha(zOut[0]) && zOut[1]==':' ){
632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zOut[0] = fossil_toupper(zOut[0]);
633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
616 635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
617 636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char zPwd[2000];
618 637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
file_getcwd(zPwd, sizeof(zPwd)-strlen(zOrigName));
638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if defined(_WIN32)
639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** On Windows, normalize the drive letter to upper case.
641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fossil_isalpha(zPwd[0]) && zPwd[1]==':' ){
643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zPwd[0] = fossil_toupper(zPwd[0]);
644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
619 646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_zero(pOut);
620 647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(pOut, "%//%/", zPwd, zOrigName);
621 648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
622 649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_resize(pOut, file_simplify_name(blob_buffer(pOut), blob_size(pOut)));
623 650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -768,37 +795,51 @@
768 795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** false, then simply return 0.
769 796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
770 797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The root of the tree is defined by the g.zLocalRoot variable.
771 798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
772 799 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int file_tree_name(const char *zOrigName, Blob *pOut, int errFatal){
773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int n;
800 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob localRoot;
801 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nLocalRoot;
802 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zLocalRoot;
774 803 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob full;
775 804 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nFull;
776 805 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zFull;
777 806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
778 807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_zero(pOut);
779 808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_must_be_within_tree();
809 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ file_canonical_name(g.zLocalRoot, &localRoot);
810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nLocalRoot = blob_size(&localRoot);
811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zLocalRoot = blob_buffer(&localRoot);
812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if ( zLocalRoot[nLocalRoot-1]!='/' ){
813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&localRoot, "/", 1);
814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nLocalRoot = blob_size(&localRoot);
815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zLocalRoot = blob_buffer(&localRoot);
816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( nLocalRoot>0 && zLocalRoot[nLocalRoot-1]=='/' );
780 818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
file_canonical_name(zOrigName, &full);
781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- n = strlen(g.zLocalRoot);
782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( n>0 && g.zLocalRoot[n-1]=='/' );
783 819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nFull = blob_size(&full);
784 820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zFull = blob_buffer(&full);
785 821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
786 822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Special case. zOrigName refers to g.zLocalRoot directory. */
787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( nFull==n-1 && memcmp(g.zLocalRoot, zFull, nFull)==0 ){
823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nFull==nLocalRoot-1 && memcmp(zLocalRoot, zFull, nFull)==0 ){
788 824 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_append(pOut, ".", 1);
825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&localRoot);
826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&full);
789 827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 1;
790 828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
791 829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( nFull<=n || memcmp(g.zLocalRoot, zFull, n) ){
830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nFull<=nLocalRoot || memcmp(zLocalRoot, zFull, nLocalRoot) ){
831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&localRoot);
793 832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&full);
794 833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( errFatal ){
795 834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_fatal("file outside of checkout tree: %s", zOrigName);
796 835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
797 836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 0;
798 837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
799 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append(pOut, &zFull[n], nFull-n);
838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(pOut, &zFull[nLocalRoot], nFull-nLocalRoot);
839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&localRoot);
840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&full);
800 841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 1;
801 842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
802 843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
803 844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
804 845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** COMMAND: test-tree-name
@@ -861,25 +902,44 @@
861 902 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
862 903 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Construct a random temporary filename into zBuf[].
863 904 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
864 905 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void file_tempname(int nBuf, char *zBuf){
865 906 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static const char *azDirs[] = {
907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if defined(_WIN32)
908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* GetTempPath */
909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* TEMP */
910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* TMP */
911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #else
866 912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"/var/tmp",
867 913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"/usr/tmp",
868 914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"/tmp",
869 915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"/temp",
916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
870 917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
".",
871 918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
872 919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static const unsigned char zChars[] =
873 920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"abcdefghijklmnopqrstuvwxyz"
874 921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
875 922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"0123456789";
876 923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unsigned int i, j;
877 924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zDir = ".";
878 925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int cnt = 0;
926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if defined(_WIN32)
928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char zTmpPath[MAX_PATH];
929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( GetTempPath(sizeof(zTmpPath), zTmpPath) ){
931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ azDirs[0] = zTmpPath;
932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ azDirs[1] = fossil_getenv("TEMP");
935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ azDirs[2] = fossil_getenv("TMP");
936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
879 938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
880 939 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<sizeof(azDirs)/sizeof(azDirs[0]); i++){
940 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( azDirs[i]==0 ) continue;
881 941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !file_isdir(azDirs[i]) ) continue;
882 942 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zDir = azDirs[i];
883 943 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
884 944 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
885 945 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -898,10 +958,15 @@
898 958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<15; i++, j++){
899 959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ];
900 960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
901 961 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zBuf[j] = 0;
902 962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}while( file_size(zBuf)>=0 );
963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if defined(_WIN32)
965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_mbcs_free((char *)azDirs[1]);
966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_mbcs_free((char *)azDirs[2]);
967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
903 968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
904 969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
905 970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
906 971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
907 972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Return true if a file named zName exists and has identical content
@@ -930,13 +995,10 @@
930 995 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/**************************************************************************
931 996 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The following routines translate between MBCS and UTF8 on windows.
932 997 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Since everything is always UTF8 on unix, these routines are no-ops
933 998 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** there.
934 999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef _WIN32
936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # include <windows.h>
937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
938 1000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
939 1001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
940 1002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Translate MBCS to UTF8. Return a pointer to the translated text.
941 1003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Call fossil_mbcs_free() to deallocate any memory used to store the
942 1004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** returned pointer when done.
943 1005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!