Skip to content

Instantly share code, notes, and snippets.

@kekoa-
Created March 27, 2018 22:47
Show Gist options
  • Select an option

  • Save kekoa-/9379c3eaffa091b6b4525ef801fa170d to your computer and use it in GitHub Desktop.

Select an option

Save kekoa-/9379c3eaffa091b6b4525ef801fa170d to your computer and use it in GitHub Desktop.
Sync changes to local filesystem via SSH (Powershell)
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