@@ -2,6 +2,7 @@ package project
2
2
3
3
import (
4
4
"bufio"
5
+ "bytes"
5
6
"cli/api"
6
7
"errors"
7
8
"fmt"
@@ -69,7 +70,7 @@ func (sshConn *SSHConnection) getSshOptions() []string {
69
70
}
70
71
71
72
func (sshConn * SSHConnection ) Rsync (localDir string , remoteDir string , quiet bool ) error {
72
- rsyncCmdArgs := []string {"-avz " , "--no-owner" , "--no-group" }
73
+ rsyncCmdArgs := []string {"--compress" , "--archive" , "--verbose " , "--no-owner" , "--no-group" }
73
74
74
75
// Retrieve and apply ignore patterns
75
76
patterns , err := GetIgnoreList ()
@@ -80,21 +81,60 @@ func (sshConn *SSHConnection) Rsync(localDir string, remoteDir string, quiet boo
80
81
rsyncCmdArgs = append (rsyncCmdArgs , "--exclude" , pat )
81
82
}
82
83
83
- // Add quiet flag if requested
84
- if quiet {
85
- rsyncCmdArgs = append (rsyncCmdArgs , "--quiet" )
86
- }
84
+ //Filter from .runpodignore
85
+ rsyncCmdArgs = append (rsyncCmdArgs , "--filter=:- .runpodignore" )
87
86
88
87
// Prepare SSH options for rsync
89
88
sshOptions := fmt .Sprintf ("ssh %s" , strings .Join (sshConn .getSshOptions (), " " ))
90
89
rsyncCmdArgs = append (rsyncCmdArgs , "-e" , sshOptions , localDir , fmt .Sprintf ("root@%s:%s" , sshConn .podIp , remoteDir ))
91
90
92
- cmd := exec .Command ("rsync" , rsyncCmdArgs ... )
93
- cmd .Stdout = os .Stdout
94
- cmd .Stderr = os .Stderr
91
+ // Perform a dry run to check if files need syncing
92
+ dryRunArgs := append (rsyncCmdArgs , "--dry-run" )
93
+ dryRunCmd := exec .Command ("rsync" , dryRunArgs ... )
94
+ var dryRunBuf bytes.Buffer
95
+ dryRunCmd .Stdout = & dryRunBuf
96
+ dryRunCmd .Stderr = & dryRunBuf
97
+ if err := dryRunCmd .Run (); err != nil {
98
+ return fmt .Errorf ("running rsync dry run: %w" , err )
99
+ }
100
+ dryRunOutput := dryRunBuf .String ()
101
+
102
+ // Parse the dry run output to determine if files need syncing
103
+ filesNeedSyncing := false
104
+ scanner := bufio .NewScanner (strings .NewReader (dryRunOutput ))
105
+ for scanner .Scan () {
106
+ line := scanner .Text ()
107
+
108
+ if line == "" || strings .Contains (line , "sending incremental file list" ) || strings .Contains (line , "total size is" ) || strings .Contains (line , "bytes/sec" ) {
109
+ continue
110
+ }
111
+
112
+ filename := filepath .Base (line )
113
+ if filename == "" || filename == "." || strings .HasSuffix (line , "/" ) {
114
+ continue
115
+ }
95
116
96
- if err := cmd .Run (); err != nil {
97
- return fmt .Errorf ("executing rsync command: %w" , err )
117
+ filesNeedSyncing = true
118
+ break
119
+ }
120
+ if err := scanner .Err (); err != nil {
121
+ return fmt .Errorf ("scanning dry run output: %w" , err )
122
+ }
123
+
124
+ // Add quiet flag if requested
125
+ if quiet {
126
+ rsyncCmdArgs = append (rsyncCmdArgs , "--quiet" )
127
+ }
128
+
129
+ if filesNeedSyncing {
130
+ fmt .Println ("Syncing files..." )
131
+
132
+ cmd := exec .Command ("rsync" , rsyncCmdArgs ... )
133
+ cmd .Stdout = os .Stdout
134
+ cmd .Stderr = os .Stderr
135
+ if err := cmd .Run (); err != nil {
136
+ return fmt .Errorf ("executing rsync command: %w" , err )
137
+ }
98
138
}
99
139
100
140
return nil
@@ -133,7 +173,7 @@ func hasChanges(localDir string, lastSyncTime time.Time) (bool, string) {
133
173
134
174
func (sshConn * SSHConnection ) SyncDir (localDir string , remoteDir string ) {
135
175
syncFiles := func () {
136
- fmt .Println ("Syncing files..." )
176
+ // fmt.Println("Syncing files...")
137
177
err := sshConn .Rsync (localDir , remoteDir , true )
138
178
if err != nil {
139
179
fmt .Printf (" error: %v\n " , err )
@@ -148,7 +188,7 @@ func (sshConn *SSHConnection) SyncDir(localDir string, remoteDir string) {
148
188
time .Sleep (100 * time .Millisecond )
149
189
hasChanged , firstModifiedFile := hasChanges (localDir , lastSyncTime )
150
190
if hasChanged {
151
- fmt .Printf ("Found changes in %s\n " , firstModifiedFile )
191
+ fmt .Printf ("Local changes detected in %s\n " , firstModifiedFile )
152
192
syncFiles ()
153
193
lastSyncTime = time .Now ()
154
194
}
0 commit comments