|
686 | 686 | var blob = to_blob(snap); |
687 | 687 |
|
688 | 688 |
|
689 | | - async function snapshot(path){ |
690 | | - |
691 | | - var snap = {}; |
692 | | - var entries = await webcontainer.fs.readdir(path,{withFileTypes:true}); |
693 | | - |
694 | | - for(var item of entries){ |
695 | | - |
696 | | - var abs = path+item.name; |
697 | | - |
698 | | - if(item.isFile()){ |
699 | | - snap[abs] = await wc.fs.readFile(abs); |
700 | | - } |
701 | | - |
702 | | - if(item.isDirectory()){ |
703 | | - var snap2 = await snapshot(abs+'/') |
704 | | - Object.assign(snap,snap2); |
705 | | - } |
706 | | - |
707 | | - }//for |
708 | | - |
709 | | - return snap; |
710 | | - |
711 | | - }//snapshot |
712 | | - |
713 | | - |
714 | 689 | function to_blob(snap){ |
715 | 690 |
|
716 | 691 | var obj = {}; |
|
782 | 757 | term.writeln.red('can only load snapshot relative to workdir'); |
783 | 758 | return; |
784 | 759 | } |
| 760 | + |
785 | 761 | if(!cur.blob){ |
786 | 762 | term.writeln.red('no blob available'); |
787 | 763 | return; |
|
797 | 773 |
|
798 | 774 | var snap = to_snapshot(blob); |
799 | 775 |
|
800 | | - |
801 | 776 | for(var [file,data] of Object.entries(snap)){ |
802 | 777 |
|
803 | 778 | var dir = file.split('/').slice(0,-1).join('/') || '/'; |
804 | 779 |
|
805 | | - await wc.fs.mkdir(dir,{recursive:true}); |
806 | | - await wc.fs.writeFile(file,data); |
| 780 | + await webcontainer.fs.mkdir(dir,{recursive:true}); |
| 781 | + await webcontainer.fs.writeFile(file,data); |
807 | 782 |
|
808 | 783 | }//for |
809 | 784 |
|
|
883 | 858 | return; |
884 | 859 | } |
885 | 860 |
|
| 861 | + if(!cur.blob){ |
| 862 | + term.writeln.red('no blob available'); |
| 863 | + return; |
| 864 | + } |
| 865 | + |
886 | 866 | var term = tabs.cur.view.terminal.term; |
887 | 867 |
|
888 | 868 | term.writeln(''); |
889 | 869 | term.writeln.green('saving zip ...'); |
890 | 870 |
|
| 871 | + var snap = await snapshot(cwd); |
| 872 | + var blob = await to_zip(snap); |
| 873 | + |
| 874 | + var file = {name:'snapshot.zip',icon:snap_icon}; |
| 875 | + |
| 876 | + complete.load(file,blob); |
| 877 | + |
| 878 | + term.writeln.green('ok.'); |
| 879 | + await term.prompt(); |
| 880 | + |
| 881 | + |
| 882 | + async function to_zip(snap){ |
| 883 | + |
| 884 | + var zip = new JSZip(); |
| 885 | + |
| 886 | + for(const [file,data] of Object.entries(snap)){ |
| 887 | + |
| 888 | + zip.file(file,data); |
| 889 | + |
| 890 | + }//for |
| 891 | + |
| 892 | + var blob = await zip.generateAsync({type:'blob',compression:'DEFLATE',compressionLevel:6}); |
| 893 | + return blob; |
| 894 | + |
| 895 | + }//to_zip |
891 | 896 |
|
892 | 897 | }//save-zip |
893 | 898 |
|
|
913 | 918 | term.writeln(''); |
914 | 919 | term.writeln.green('loading zip ...'); |
915 | 920 |
|
| 921 | + var blob = cur.blob; |
| 922 | + console.log(blob); |
| 923 | + var snap = to_snap(blob); |
| 924 | + snapshot.restore(snap); |
| 925 | + |
| 926 | + term.writeln.green('ok.'); |
| 927 | + await term.prompt(); |
| 928 | + |
| 929 | + |
| 930 | + async function to_snap(blob){ |
| 931 | + |
| 932 | + var zip = await JSZip.loadAsync(blob); |
| 933 | + var snap = {}; |
| 934 | + var entries = Object.values(zip.files); |
| 935 | + |
| 936 | + for(var entry of entries){ |
| 937 | + |
| 938 | + if(entry.dir)continue; |
| 939 | + |
| 940 | + var data = await entry.async('uint8array'); |
| 941 | + var path = entry.name.startsWith('/') ? entry.name : '/'+entry.name; |
| 942 | + snap[path] = data; |
| 943 | + |
| 944 | + }//for |
| 945 | + |
| 946 | + return snap; |
| 947 | + |
| 948 | + }//to_snap |
916 | 949 |
|
917 | 950 | }//load-zip |
918 | 951 |
|
|
1042 | 1075 | }//save |
1043 | 1076 |
|
1044 | 1077 |
|
| 1078 | + //: |
| 1079 | + |
| 1080 | + |
| 1081 | + async function snapshot(path){ |
| 1082 | + console.log('snapshot',path); |
| 1083 | + var snap = {}; |
| 1084 | + var entries = await webcontainer.fs.readdir(path,{withFileTypes:true}); |
| 1085 | + |
| 1086 | + for(var item of entries){ |
| 1087 | + |
| 1088 | + var abs = path+item.name; |
| 1089 | + |
| 1090 | + if(item.isFile()){ |
| 1091 | + console.log(abs); |
| 1092 | + snap[abs] = await wc.fs.readFile(abs); |
| 1093 | + } |
| 1094 | + |
| 1095 | + if(item.isDirectory()){ |
| 1096 | + var snap2 = await snapshot(abs+'/') |
| 1097 | + Object.assign(snap,snap2); |
| 1098 | + } |
| 1099 | + |
| 1100 | + }//for |
| 1101 | + |
| 1102 | + return snap; |
| 1103 | + |
| 1104 | + }//snapshot |
| 1105 | + |
| 1106 | + |
| 1107 | + snapshot.restore = async function(snap){ |
| 1108 | + |
| 1109 | + for(var [file,data] of Object.entries(snap)){ |
| 1110 | + |
| 1111 | + var dir = file.split('/').slice(0,-1).join('/') || '/'; |
| 1112 | + |
| 1113 | + await webcontainer.fs.mkdir(dir,{recursive:true}); |
| 1114 | + await webcontainer.fs.writeFile(file,data); |
| 1115 | + |
| 1116 | + }//for |
| 1117 | + |
| 1118 | + }//restore |
| 1119 | + |
| 1120 | + |
1045 | 1121 | //: |
1046 | 1122 |
|
1047 | 1123 |
|
|
0 commit comments