Created
March 27, 2018 22:47
-
-
Save kekoa-/9379c3eaffa091b6b4525ef801fa170d to your computer and use it in GitHub Desktop.
Sync changes to local filesystem via SSH (Powershell)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| param ( | |
| [string]$searchPath = "", | |
| [string]$puttySession = "", | |
| [string]$destPath = "" | |
| ) | |
| # | |
| # Init | |
| # | |
| # | |
| # Functions | |
| # | |
| function setup_watcher { | |
| $watcher = New-Object System.IO.FileSystemWatcher | |
| $watcher.Path = $searchPath | |
| $watcher.IncludeSubdirectories = $true | |
| $watcher.EnableRaisingEvents = $true | |
| $watcher | |
| } | |
| function subscribe_watcher_events { | |
| param( | |
| [System.IO.FileSystemWatcher]$watcher | |
| ) | |
| $null = register-objectevent $watcher "Changed" | |
| $null = register-objectevent $watcher "Created" | |
| $null = register-objectevent $watcher "Deleted" | |
| $null = register-objectevent $watcher "Renamed" | |
| } | |
| function filter_events { | |
| get-event | | |
| Select-Object ` | |
| -Property ` | |
| @{ | |
| Name="FullPath"; | |
| Expression={ $_.SourceArgs.FullPath } | |
| }, | |
| @{ | |
| Name="Orig"; | |
| Expression={ $_ } | |
| } | | |
| Where-Object -FilterScript { | |
| -not ( | |
| ($_.Orig.SourceArgs.ChangeType -eq "Changed") -and | |
| (Test-Path $_.Orig.SourceArgs.FullPath -pathType container) | |
| ) | |
| } | | |
| Where-Object -FilterScript { | |
| -not ( | |
| ($_.Orig.SourceArgs.FullPath -like '*.git*') -or | |
| ($_.Orig.SourceArgs.FullPath -like '*.class*') -or | |
| ($_.Orig.SourceArgs.FullPath -like '*.idea*') -or | |
| ($_.Orig.SourceArgs.FullPath -like '*.ipr*') -or | |
| ($_.Orig.SourceArgs.FullPath -like '*.iws*') -or | |
| ($_.Orig.SourceArgs.FullPath -like '*.vs*') -or | |
| ($_.Orig.SourceArgs.FullPath -like '*.TMP*') -or | |
| ($_.Orig.SourceArgs.FullPath -like '*.#*') -or | |
| ($_.Orig.SourceArgs.FullPath -like '*~') -or | |
| ($_.Orig.SourceArgs.FullPath -like '*flycheck*') -or | |
| ($_.Orig.SourceArgs.FullPath -like '*stack-work*') -or | |
| ($_.Orig.SourceArgs.FullPath -like '*TAGS') -or | |
| ($_.Orig.SourceArgs.FullPath -like '*fsproj*') | |
| ) | |
| } | | |
| Sort-Object -Property FullPath -Unique | |
| } | |
| function handle_change_event { | |
| param ( [System.Management.Automation.PSEventArgs]$event ) | |
| $fileSrc = $event.SourceEventArgs.FullPath | |
| $fileDest = $fileSrc.Replace($searchPath, $destPath) | |
| $fileDest = $fileDest.Replace('\', '/') | |
| write-output "Copying $fileSrc to $fileDest" | |
| pscp $fileSrc "$($puttySession):$($fileDest)" | |
| } | |
| function handle_delete_event { | |
| param ( [System.Management.Automation.PSEventArgs]$event ) | |
| $fileSrc = $event.SourceEventArgs.FullPath | |
| $fileDest = $fileSrc.Replace($searchPath, $destPath) | |
| $fileDest = $fileDest.Replace('\', '/') | |
| write-output "Deleting $fileDest" | |
| plink -load $puttySession rm $fileDest | |
| } | |
| function handle_rename_event { | |
| param ( [System.Management.Automation.PSEventArgs]$event ) | |
| $rawFileSrc = $event.SourceEventArgs.OldFullPath | |
| $fileSrc = $rawFileSrc.Replace($searchPath, $destPath) | |
| $fileSrc = $fileSrc.Replace('\', '/') | |
| $rawFileDest = $event.SourceEventArgs.FullPath | |
| $fileDest = $rawFileDest.Replace($searchPath, $destPath) | |
| $fileDest = $fileDest.Replace('\', '/') | |
| if ($fileSrc -like '*~') { | |
| handle_change_event $event | |
| } else { | |
| write-output "Renaming $fileSrc to $fileDest" | |
| plink -load $puttySession mv $fileSrc $fileDest | |
| } | |
| } | |
| function handle_event { | |
| $events = filter_events | |
| $events | foreach-object { | |
| $changeType = $_.Orig.SourceArgs.ChangeType | |
| if (($changeType -eq "Changed") -or ($changeType -eq "Created")) { | |
| handle_change_event $_.Orig | |
| } | |
| if ($changeType -eq "Deleted") { | |
| handle_delete_event $_.Orig | |
| } | |
| if ($changeType -eq "Renamed") { | |
| handle_rename_event $_.Orig | |
| } | |
| } | |
| get-event | foreach-object { | |
| remove-event -eventidentifier $_.eventidentifier | |
| } | out-null | |
| } | |
| function process_events { | |
| write-output "Watching for changes..." | |
| while($true) { | |
| $null = wait-event | |
| start-sleep -s 1 | |
| handle_event | |
| } | |
| } | |
| # | |
| # Argument Parsing | |
| # | |
| if ($searchPath.length -eq 0) { | |
| write-output "Please enter search path" | |
| exit | |
| } | |
| if ($puttySession.length -eq 0) { | |
| write-output "Please enter putty session" | |
| exit | |
| } | |
| if ($destPath.length -eq 0) { | |
| write-output "Please enter dest path" | |
| exit | |
| } | |
| # | |
| # Main | |
| # | |
| $watcher = setup_watcher | |
| subscribe_watcher_events $watcher | |
| process_events |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment