@@ -55,29 +55,31 @@ func (p *Pull) ExecuteAll() error {
5555 return err
5656 }
5757
58- fmt .Println ("Fetching list of files..." )
58+ fmt .Println ("Pulling all files from repository ..." )
5959
60- query := fmt .Sprintf ("%s.Repository.ListFiles()" , p .config .RealmPath )
61- result , err := p .client .QueryRaw (query )
60+ packageAlias := config .PackageAlias (p .config .RealmPath )
61+ query := fmt .Sprintf ("%s.Repository.SerializePullAll()" , packageAlias )
62+
63+ serializedData , err := p .client .RunQuery (p .config .RealmPath , query )
6264 if err != nil {
6365 if p .sourceMode {
6466 fmt .Println ("Repository not found or empty, trying to pull realm source files..." )
6567 return p .pullRealmSource ()
6668 }
67- return fmt .Errorf ("failed to list files: %w" , err )
69+ return fmt .Errorf ("failed to pull files: %w" , err )
6870 }
6971
70- if len (result ) == 0 {
72+ if len (serializedData ) == 0 {
7173 fmt .Println ("No files found in repository" )
7274 if p .sourceMode {
7375 return p .pullRealmSource ()
7476 }
7577 return nil
7678 }
7779
78- files , err := parseFileList ( result )
80+ files , err := parseSerializedFiles ( string ( serializedData ) )
7981 if err != nil {
80- return fmt .Errorf ("failed to parse file list : %w" , err )
82+ return fmt .Errorf ("failed to parse files : %w" , err )
8183 }
8284
8385 if len (files ) == 0 {
@@ -88,12 +90,13 @@ func (p *Pull) ExecuteAll() error {
8890 return nil
8991 }
9092
91- fmt .Printf ("Found %d file(s), pulling all ...\n " , len (files ))
93+ fmt .Printf ("Found %d file(s), writing to disk ...\n " , len (files ))
9294
93- for _ , filename := range files {
94- if err := p . Execute (filename ); err != nil {
95- return fmt .Errorf ("failed to pull '%s': %w" , filename , err )
95+ for filename , content := range files {
96+ if err := filesystem . WriteFile (filename , content ); err != nil {
97+ return fmt .Errorf ("failed to write '%s': %w" , filename , err )
9698 }
99+ fmt .Printf (" pulled: %s (%d bytes)\n " , filename , len (content ))
97100 }
98101
99102 fmt .Printf ("\n Successfully pulled %d file(s)\n " , len (files ))
@@ -169,6 +172,55 @@ func parseRealmFileList(output string) []string {
169172 return files
170173}
171174
175+ func parseSerializedFiles (data string ) (map [string ][]byte , error ) {
176+ lines := strings .Split (data , "\n " )
177+ files := make (map [string ][]byte )
178+
179+ for _ , line := range lines {
180+ if line == "" {
181+ continue
182+ }
183+
184+ parts := strings .SplitN (line , "|" , 2 )
185+ if len (parts ) != 2 {
186+ continue
187+ }
188+
189+ filename := unescapeString (parts [0 ])
190+ content := unescapeString (parts [1 ])
191+ files [filename ] = []byte (content )
192+ }
193+
194+ return files , nil
195+ }
196+
197+ func unescapeString (s string ) string {
198+ result := ""
199+ i := 0
200+ for i < len (s ) {
201+ if s [i ] == '\\' && i + 1 < len (s ) {
202+ next := s [i + 1 ]
203+ if next == '\\' {
204+ result += "\\ "
205+ i += 2
206+ } else if next == '|' {
207+ result += "|"
208+ i += 2
209+ } else if next == 'n' {
210+ result += "\n "
211+ i += 2
212+ } else {
213+ result += string (s [i ])
214+ i ++
215+ }
216+ } else {
217+ result += string (s [i ])
218+ i ++
219+ }
220+ }
221+ return result
222+ }
223+
172224func parseFileList (data string ) ([]string , error ) {
173225 str := strings .TrimSpace (data )
174226
0 commit comments