Commit ba6047f599fa385e2728f8ec1139418d4cfb98b1
1 parent
3e2f4c14
Added areas, moved to scp, added upload/download and various fixes.
Showing
2 changed files
with
150 additions
and
101 deletions
blimp.nim
| @@ -2,30 +2,49 @@ import md5, os, osproc, parseopt2, strutils, parsecfg, streams, lapp, subexes, t | @@ -2,30 +2,49 @@ import md5, os, osproc, parseopt2, strutils, parsecfg, streams, lapp, subexes, t | ||
| 2 | 2 | ||
| 3 | # blimp is a little utility program for handling large files | 3 | # blimp is a little utility program for handling large files |
| 4 | # in git repositories. Its inspired by git-fat and s3annex | 4 | # in git repositories. Its inspired by git-fat and s3annex |
| 5 | -# but doesn't rely on S3 for storage - it uses rsync like git-fat. | 5 | +# but doesn't rely on S3 for storage - it uses sftp but |
| 6 | +# performs the file operations using externally configured commands. | ||
| 6 | # It is a single binary without any dependencies. | 7 | # It is a single binary without any dependencies. |
| 7 | # | 8 | # |
| 9 | +# It can also keep track of multiple remote areas and do up/downloads | ||
| 10 | +# independent from git. This is useful in build scripts, up and | ||
| 11 | +# downloading artifacts. | ||
| 12 | +# | ||
| 8 | # Just run blimp --help for detailed help. | 13 | # Just run blimp --help for detailed help. |
| 9 | 14 | ||
| 10 | const | 15 | const |
| 11 | versionMajor* = 0 | 16 | versionMajor* = 0 |
| 12 | - versionMinor* = 3 | 17 | + versionMinor* = 4 |
| 13 | versionPatch* = 0 | 18 | versionPatch* = 0 |
| 14 | versionAsString* = $versionMajor & "." & $versionMinor & "." & $versionPatch | 19 | versionAsString* = $versionMajor & "." & $versionMinor & "." & $versionPatch |
| 15 | 20 | ||
| 21 | +type | ||
| 22 | + RemoteArea = ref object of RootObj | ||
| 23 | + name*: string | ||
| 24 | + url*: string | ||
| 25 | + upload*: string | ||
| 26 | + download*: string | ||
| 27 | + delete*: string | ||
| 28 | + | ||
| 16 | var | 29 | var |
| 17 | - blimpStore, remoteBlimpStore, uploadCommandFormat, downloadCommandFormat, deleteCommandFormat, rsyncPassword, blimpVersion: string = nil | 30 | + blimpStore, blimpVersion: string = nil |
| 18 | homeDir, currentDir, gitRootDir: string | 31 | homeDir, currentDir, gitRootDir: string |
| 19 | verbose, stdio, onAllDeflated, onAllFiltered: bool | 32 | verbose, stdio, onAllDeflated, onAllFiltered: bool |
| 20 | - stdinContent: string = nil | 33 | + stdinContent, area: string = nil |
| 34 | + areas = newTable[string, RemoteArea]() | ||
| 35 | + remoteArea: RemoteArea | ||
| 21 | 36 | ||
| 22 | let | 37 | let |
| 23 | defaultConfig = """ | 38 | defaultConfig = """ |
| 24 | -[rsync] | 39 | +[blimp] |
| 40 | +# Minimal version, otherwise stop | ||
| 41 | +# version = """ & versionAsString & """ | ||
| 42 | + | ||
| 25 | # Set your local blimpstore directory. You can use %home%, %cwd% and %gitroot% in paths, works cross platform. | 43 | # Set your local blimpstore directory. You can use %home%, %cwd% and %gitroot% in paths, works cross platform. |
| 26 | # Example: | 44 | # Example: |
| 27 | # # Place it inside the git clone | 45 | # # Place it inside the git clone |
| 28 | # blimpstore = "%gitroot%/.git/blimpstore" | 46 | # blimpstore = "%gitroot%/.git/blimpstore" |
| 47 | +# | ||
| 29 | # # Place it in current working directory (not very useful) | 48 | # # Place it in current working directory (not very useful) |
| 30 | # blimpstore = "%cwd%/blimpstore" | 49 | # blimpstore = "%cwd%/blimpstore" |
| 31 | # | 50 | # |
| @@ -33,27 +52,28 @@ let | @@ -33,27 +52,28 @@ let | ||
| 33 | # # Place it in the users home directory | 52 | # # Place it in the users home directory |
| 34 | # blimpstore = "%home%/blimpstore" | 53 | # blimpstore = "%home%/blimpstore" |
| 35 | 54 | ||
| 36 | -# Set this to your remote rsync location | ||
| 37 | -remote = "blimpuser@some-rsync-server.com::blimpstore" | ||
| 38 | -# Set this to your rsync password, it will be written out as a password-file called .blimp.pass on every rsync. | ||
| 39 | -password = "some-good-rsync-password-for-blimpuser" | ||
| 40 | - | ||
| 41 | -# The following three formats should not need editing. | ||
| 42 | -# $1 is the blimp filename, $2 is remote location and $3 is the local blimpstore directory set above. | ||
| 43 | -# NOTE: The password-file .blimp.pass will be created by blimp on every command, do not remove that option. | ||
| 44 | -upload = "rsync --password-file $3/.blimp.pass -avzP $3/$1 $2/" | ||
| 45 | -download = "rsync --password-file $3/.blimp.pass -avzP $2/$1 $3/" | ||
| 46 | -# This deletes a single file from destination, that is already deleted in source. Yeah... insane! But it works. | ||
| 47 | -delete = "rsync --password-file $3/.blimp.pass -dv --delete --existing --ignore-existing --include '$1' --exclude '*' $3/ $2" | ||
| 48 | - | ||
| 49 | -[blimp] | ||
| 50 | -# Minimal version, otherwise stop | ||
| 51 | -# version = """ & versionAsString | 55 | +[areas] |
| 56 | +# This is where ypu define up/download areas. The area called "remote" is the | ||
| 57 | +# default area used unless --area is used. | ||
| 58 | +# $1 is the blimp filename, $2 is the remote url and $3 is the local blimpstore directory set above. | ||
| 59 | +remote-url = "blimpuser@some-server.com:/var/opt/blimpstore" | ||
| 60 | +remote-upload = "scp -pq $3/$1 $2/" | ||
| 61 | +remote-download = "scp -pq $2/$1 $3/" | ||
| 52 | 62 | ||
| 63 | +# Example area that can be used with upload/download commands and --area option. | ||
| 64 | +release-url = "blimpuser@some-server.com:/var/opt/release" | ||
| 65 | +release-upload = "scp -r $3/$1 $2/" | ||
| 66 | +release-download = "scp -r $2/$1 $3/" | ||
| 67 | +""" | ||
| 53 | 68 | ||
| 54 | proc cmd(cmd: string): string = | 69 | proc cmd(cmd: string): string = |
| 55 | try: | 70 | try: |
| 56 | - let tup = execCmdEx(cmd) | 71 | + # Otherwise pipes will not work for git commands etc |
| 72 | + when defined(windows): | ||
| 73 | + let tup = execCmdEx("cmd /c \"" & cmd & "\"") | ||
| 74 | + else: | ||
| 75 | + let tup = execCmdEx(cmd) | ||
| 76 | + #echo "cmd: " & $cmd & "err:" & $tup[1] | ||
| 57 | if tup[1] == 0: | 77 | if tup[1] == 0: |
| 58 | result = strip(tup[0]) | 78 | result = strip(tup[0]) |
| 59 | else: | 79 | else: |
| @@ -99,31 +119,41 @@ proc parseConfFile(filename: string) = | @@ -99,31 +119,41 @@ proc parseConfFile(filename: string) = | ||
| 99 | if verbose: echo "Reading config: " & filename | 119 | if verbose: echo "Reading config: " & filename |
| 100 | var p: CfgParser | 120 | var p: CfgParser |
| 101 | open(p, f, filename) | 121 | open(p, f, filename) |
| 122 | + var section: string | ||
| 123 | + var area: RemoteArea | ||
| 102 | while true: | 124 | while true: |
| 103 | var e = next(p) | 125 | var e = next(p) |
| 104 | case e.kind | 126 | case e.kind |
| 105 | of cfgEof: | 127 | of cfgEof: |
| 106 | break | 128 | break |
| 107 | of cfgSectionStart: | 129 | of cfgSectionStart: |
| 108 | - continue # Ignore | 130 | + section = e.section |
| 109 | of cfgKeyValuePair: | 131 | of cfgKeyValuePair: |
| 110 | - case e.key | ||
| 111 | - of "blimpstore": | ||
| 112 | - if blimpStore.isNil: blimpStore = expandDirs(e.value) | ||
| 113 | - of "remote": | ||
| 114 | - if remoteBlimpStore.isNil: remoteBlimpStore = expandDirs(e.value) | ||
| 115 | - of "password": | ||
| 116 | - if rsyncPassword.isNil: rsyncPassword = e.value | ||
| 117 | - of "upload": | ||
| 118 | - if uploadCommandFormat.isNil: uploadCommandFormat = expandDirs(e.value) | ||
| 119 | - of "download": | ||
| 120 | - if downloadCommandFormat.isNil: downloadCommandFormat = expandDirs(e.value) | ||
| 121 | - of "delete": | ||
| 122 | - if deleteCommandFormat.isNil: deleteCommandFormat = expandDirs(e.value) | ||
| 123 | - of "version": | ||
| 124 | - if blimpVersion.isNil: blimpVersion = e.value | 132 | + case section |
| 133 | + of "blimp": | ||
| 134 | + case e.key | ||
| 135 | + of "blimpstore": | ||
| 136 | + if blimpStore.isNil: blimpStore = e.value | ||
| 137 | + of "version": | ||
| 138 | + if blimpVersion.isNil: blimpVersion = e.value | ||
| 139 | + else: | ||
| 140 | + quit("Unknown blimp configuration: " & e.key) | ||
| 125 | else: | 141 | else: |
| 126 | - quit("Unknown configuration: " & e.key) | 142 | + # Then we presume its an area |
| 143 | + if area.isNil or area.name != section: | ||
| 144 | + area = RemoteArea(name: section) | ||
| 145 | + areas[area.name] = area | ||
| 146 | + case e.key | ||
| 147 | + of "url": | ||
| 148 | + if area.url.isNil: area.url = expandDirs(e.value) | ||
| 149 | + of "upload": | ||
| 150 | + if area.upload.isNil: area.upload = expandDirs(e.value) | ||
| 151 | + of "download": | ||
| 152 | + if area.download.isNil: area.download = expandDirs(e.value) | ||
| 153 | + of "delete": | ||
| 154 | + if area.delete.isNil: area.delete = expandDirs(e.value) | ||
| 155 | + else: | ||
| 156 | + quit("Unknown area configuration: " & e.key) | ||
| 127 | of cfgOption: | 157 | of cfgOption: |
| 128 | quit("Unknown configuration: " & e.key) | 158 | quit("Unknown configuration: " & e.key) |
| 129 | of cfgError: | 159 | of cfgError: |
| @@ -131,42 +161,35 @@ proc parseConfFile(filename: string) = | @@ -131,42 +161,35 @@ proc parseConfFile(filename: string) = | ||
| 131 | close(p) | 161 | close(p) |
| 132 | 162 | ||
| 133 | # Trivial helper to enable verbose | 163 | # Trivial helper to enable verbose |
| 134 | -proc run(cmd: string): auto = | 164 | +proc run(cmd: string): int = |
| 135 | if verbose: echo(cmd) | 165 | if verbose: echo(cmd) |
| 136 | execCmd(cmd) | 166 | execCmd(cmd) |
| 137 | 167 | ||
| 138 | -# Every rsync command, make sure we have a password file | ||
| 139 | -proc rsyncRun(cmd: string): auto = | ||
| 140 | - if not rsyncPassword.isNil: | ||
| 141 | - writeFile(blimpStore / ".blimp.pass", rsyncPassword) | ||
| 142 | - if execCmd("chmod 600 " & blimpStore / ".blimp.pass") != 0: | ||
| 143 | - quit("Failed to chmod 600 " & blimpStore / ".blimp.pass") | ||
| 144 | - run(cmd) | ||
| 145 | - | ||
| 146 | -# Upload a file to the remote master blimpStore | ||
| 147 | -proc uploadFile(blimpFilename: string) = | ||
| 148 | - if remoteBlimpStore.isNil: | ||
| 149 | - echo("Remote blimpstore not set in configuration file, skipping uploading content:\n\t" & blimpFilename) | 168 | + |
| 169 | +# Upload a file to the remote area | ||
| 170 | +proc uploadFile(filename, fromDir: string) = | ||
| 171 | + if remoteArea.isNil: | ||
| 172 | + echo("Remote area not set in configuration file, skipping uploading content:\n\t" & filename) | ||
| 150 | return | 173 | return |
| 151 | - let errorCode = rsyncRun(format(uploadCommandFormat, blimpFilename, remoteBlimpStore, blimpStore)) | 174 | + let errorCode = run(format(remoteArea.upload, filename, remoteArea.url, fromDir)) |
| 152 | if errorCode != 0: | 175 | if errorCode != 0: |
| 153 | - quit("Something went wrong uploading " & blimpFilename & " to " & remoteBlimpStore, 2) | 176 | + quit("Something went wrong uploading " & filename & " to " & remoteArea.url, 2) |
| 154 | 177 | ||
| 155 | -# Download a file to the remote master blimpStore | ||
| 156 | -proc downloadFile(blimpFilename: string) = | ||
| 157 | - if remoteBlimpStore.isNil: | ||
| 158 | - quit("Remote blimpstore not set in configuration file, can not download content:\n\t" & blimpFilename) | ||
| 159 | - let errorCode = rsyncRun(format(downloadCommandFormat, blimpFilename, remoteBlimpStore, blimpStore)) | 178 | +# Download a file to the remote area |
| 179 | +proc downloadFile(filename, toDir: string) = | ||
| 180 | + if remoteArea.isNil: | ||
| 181 | + quit("Remote area not set in configuration file, can not download content:\n\t" & filename) | ||
| 182 | + let errorCode = run(format(remoteArea.download, filename, remoteArea.url, toDir)) | ||
| 160 | if errorCode != 0: | 183 | if errorCode != 0: |
| 161 | - quit("Something went wrong downloading " & blimpFilename & " from " & remoteBlimpStore, 3) | 184 | + quit("Something went wrong downloading " & filename & " from " & remoteArea.url, 3) |
| 162 | 185 | ||
| 163 | # Delete a file from the remote master blimpStore | 186 | # Delete a file from the remote master blimpStore |
| 164 | -proc remoteDeleteFile(blimpFilename: string) = | ||
| 165 | - if remoteBlimpStore.isNil: | 187 | +proc remoteDeleteFile(filename: string) = |
| 188 | + if remoteArea.isNil: | ||
| 166 | return | 189 | return |
| 167 | - let errorCode = rsyncRun(format(deleteCommandFormat, blimpFilename, remoteBlimpStore, blimpStore)) | 190 | + let errorCode = run(format(remoteArea.delete, filename, remoteArea.url, blimpStore)) |
| 168 | if errorCode != 0: | 191 | if errorCode != 0: |
| 169 | - quit("Something went wrong deleting " & blimpFilename & " from " & remoteBlimpStore, 3) | 192 | + quit("Something went wrong deleting " & filename & " from " & remoteArea.url, 3) |
| 170 | 193 | ||
| 171 | # Copy content to blimpStore and upload if it was a new file or upload == true. | 194 | # Copy content to blimpStore and upload if it was a new file or upload == true. |
| 172 | proc copyToBlimpStore(filename, blimpFilename: string) = | 195 | proc copyToBlimpStore(filename, blimpFilename: string) = |
| @@ -178,13 +201,13 @@ proc copyToBlimpStore(filename, blimpFilename: string) = | @@ -178,13 +201,13 @@ proc copyToBlimpStore(filename, blimpFilename: string) = | ||
| 178 | quit("Failed writing file: " & blimpStore / blimpFilename & " from stdin", 1) | 201 | quit("Failed writing file: " & blimpStore / blimpFilename & " from stdin", 1) |
| 179 | else: | 202 | else: |
| 180 | copyFile(filename, blimpStore / blimpFilename) | 203 | copyFile(filename, blimpStore / blimpFilename) |
| 181 | - uploadFile(blimpFilename) | 204 | + uploadFile(blimpFilename, blimpStore) |
| 182 | 205 | ||
| 183 | 206 | ||
| 184 | # Copy content from blimpStore, and downloading first if needed | 207 | # Copy content from blimpStore, and downloading first if needed |
| 185 | proc copyFromBlimpStore(blimpFilename, filename: string) = | 208 | proc copyFromBlimpStore(blimpFilename, filename: string) = |
| 186 | if not existsFile(blimpStore / blimpFilename): | 209 | if not existsFile(blimpStore / blimpFilename): |
| 187 | - downloadFile(blimpFilename) | 210 | + downloadFile(blimpFilename, blimpStore) |
| 188 | if stdio: | 211 | if stdio: |
| 189 | try: | 212 | try: |
| 190 | var content = readFile(blimpStore / blimpFilename) | 213 | var content = readFile(blimpStore / blimpFilename) |
| @@ -279,18 +302,29 @@ proc remove(filename: string) = | @@ -279,18 +302,29 @@ proc remove(filename: string) = | ||
| 279 | echo("\t" & filename & " content removed from blimpstore locally and remotely.") | 302 | echo("\t" & filename & " content removed from blimpstore locally and remotely.") |
| 280 | 303 | ||
| 281 | 304 | ||
| 282 | -# Copy original file to blimpStore and replace with hash stub in git. | ||
| 283 | -proc upload(filename: string) = | 305 | +# Make sure a file already in blimpstore is uploaded to remote area. |
| 306 | +proc push(filename: string) = | ||
| 284 | if verbose: echo "Uploading " & filename | 307 | if verbose: echo "Uploading " & filename |
| 285 | var blimpFilename = blimpFilename(filename) | 308 | var blimpFilename = blimpFilename(filename) |
| 286 | if blimpFilename.isNil: | 309 | if blimpFilename.isNil: |
| 287 | blimpFilename = computeBlimpFilename(filename) | 310 | blimpFilename = computeBlimpFilename(filename) |
| 288 | if existsFile(blimpStore / blimpFilename): | 311 | if existsFile(blimpStore / blimpFilename): |
| 289 | - uploadFile(blimpFilename) | 312 | + uploadFile(blimpFilename, blimpStore) |
| 290 | if verbose: echo("\t" & filename & " uploaded.") | 313 | if verbose: echo("\t" & filename & " uploaded.") |
| 291 | else: | 314 | else: |
| 292 | if verbose: echo("\t" & filename & " is not in blimpstore, skipping.") | 315 | if verbose: echo("\t" & filename & " is not in blimpstore, skipping.") |
| 293 | 316 | ||
| 317 | +# Upload a file to a remote area | ||
| 318 | +proc upload(filename: string) = | ||
| 319 | + if verbose: echo "Uploading " & filename | ||
| 320 | + uploadFile(filename, currentDir) | ||
| 321 | + if verbose: echo("\t" & filename & " uploaded.") | ||
| 322 | + | ||
| 323 | +# Download a file from a remote area. | ||
| 324 | +proc download(filename: string) = | ||
| 325 | + if verbose: echo "Downloading " & filename | ||
| 326 | + downloadFile(filename, currentDir) | ||
| 327 | + if verbose: echo("\t" & filename & " downloaded.") | ||
| 294 | 328 | ||
| 295 | proc setupBlimpStore() = | 329 | proc setupBlimpStore() = |
| 296 | try: | 330 | try: |
| @@ -311,27 +345,25 @@ proc `$`(x: string): string = | @@ -311,27 +345,25 @@ proc `$`(x: string): string = | ||
| 311 | proc dumpConfig() = | 345 | proc dumpConfig() = |
| 312 | echo "\nDump of configuration:" | 346 | echo "\nDump of configuration:" |
| 313 | echo "\tblimpStore: " & blimpStore | 347 | echo "\tblimpStore: " & blimpStore |
| 314 | - echo "\tremoteBlimpStore: " & remoteBlimpStore | ||
| 315 | - echo "\tuploadCommandFormat: " & uploadCommandFormat | ||
| 316 | - echo "\tdownloadCommandFormat: " & downloadCommandFormat | ||
| 317 | - echo "\tdeleteCommandFormat: " & deleteCommandFormat | ||
| 318 | - echo "\trsyncPassword: " & $rsyncPassword | 348 | + echo "\tremote-url: " & remoteArea.url |
| 349 | + echo "\tremote-upload: " & remoteArea.upload | ||
| 350 | + echo "\tremote-download: " & remoteArea.download | ||
| 319 | echo "\tblimpVersion: " & $blimpVersion | 351 | echo "\tblimpVersion: " & $blimpVersion |
| 320 | echo "\n" | 352 | echo "\n" |
| 321 | 353 | ||
| 322 | let synopsis = """ | 354 | let synopsis = """ |
| 323 | blimp [options] <command> <filenames...> | 355 | blimp [options] <command> <filenames...> |
| 324 | - -h,--help Show this | ||
| 325 | - --version Show version of blimp | ||
| 326 | - -v,--verbose Verbosity, only works without -s | ||
| 327 | - -i,--init Set blimp filter in git config | 356 | + -h,--help Show this |
| 357 | + --version Show version of blimp | ||
| 358 | + -v,--verbose Verbosity, only works without -s | ||
| 328 | ---------- | 359 | ---------- |
| 329 | - <command> (string) (d)eflate, (i)nflate, remove, upload | ||
| 330 | - -a,--all Operate on all deflated files in clone | ||
| 331 | - -f,--filter Operate on all files matching blimp filter | 360 | + <command> (string) (d)eflate, (i)nflate, init, remove, push, upload, download |
| 361 | + --all Operate on all deflated files in clone | ||
| 362 | + -f,--filter Operate on all files matching blimp filter | ||
| 363 | + -a,--area (default remote) The area to use for remote up/downloads | ||
| 332 | ---------- | 364 | ---------- |
| 333 | - -s,--stdio If given, use stdin/stdout for content. | ||
| 334 | - <filenames> (string...) One or more filepaths to inflate/deflate | 365 | + -s,--stdio If given, use stdin/stdout for content. |
| 366 | + <filenames> (string...) One or more filepaths to inflate/deflate | ||
| 335 | """ | 367 | """ |
| 336 | let help = """ | 368 | let help = """ |
| 337 | 369 | ||
| @@ -385,9 +417,12 @@ let help = """ | @@ -385,9 +417,12 @@ let help = """ | ||
| 385 | the current content version, not older versions. The file itself is first | 417 | the current content version, not older versions. The file itself is first |
| 386 | inflated, if needed, and not deleted. This only "unblimps" the file. | 418 | inflated, if needed, and not deleted. This only "unblimps" the file. |
| 387 | 419 | ||
| 388 | - The upload command (no single character shortcut) will upload the given file | 420 | + The push command (no single character shortcut) will force upload the given file |
| 389 | from the local blimpstore to the remote. This is normally done automatically, | 421 | from the local blimpstore to the remote. This is normally done automatically, |
| 390 | - but this way you can make sure they are up on the remote. | 422 | + but this way you can make sure they are synced onto the remote. |
| 423 | + | ||
| 424 | + The upload and download commands are used to distribute artifacts typically in a | ||
| 425 | + build script. If no --area is given, they use the standard "remote" area. | ||
| 391 | 426 | ||
| 392 | In order to have blimp work automatically you can: | 427 | In order to have blimp work automatically you can: |
| 393 | 428 | ||
| @@ -398,7 +433,7 @@ let help = """ | @@ -398,7 +433,7 @@ let help = """ | ||
| 398 | git config filter.blimp.clean "blimp -s d %f" | 433 | git config filter.blimp.clean "blimp -s d %f" |
| 399 | git config filter.blimp.smudge "blimp -s i %f" | 434 | git config filter.blimp.smudge "blimp -s i %f" |
| 400 | 435 | ||
| 401 | - The above git config can be done by running "blimp --init". | 436 | + The above git config can be done by running "blimp init" just like git. |
| 402 | 437 | ||
| 403 | When the above is done (per clone) git will automatically run blimp deflate | 438 | When the above is done (per clone) git will automatically run blimp deflate |
| 404 | just before committing and blimp inflate when operations are done. | 439 | just before committing and blimp inflate when operations are done. |
| @@ -406,9 +441,10 @@ let help = """ | @@ -406,9 +441,10 @@ let help = """ | ||
| 406 | This means that if you clone a git repository that already has a .gitattributes | 441 | This means that if you clone a git repository that already has a .gitattributes |
| 407 | file in it that uses the blimp filter, then you should do: | 442 | file in it that uses the blimp filter, then you should do: |
| 408 | 443 | ||
| 409 | - blimp --init inflate --filter | 444 | + blimp init |
| 445 | + blimp inflate --filter | ||
| 410 | 446 | ||
| 411 | - This will configure the blimp filter and also find and inflate all deflated | 447 | + This will configure the blimp filter and then find and inflate all deflated |
| 412 | files throughout the clone. | 448 | files throughout the clone. |
| 413 | """ | 449 | """ |
| 414 | 450 | ||
| @@ -425,6 +461,7 @@ verbose = args["verbose"].asBool | @@ -425,6 +461,7 @@ verbose = args["verbose"].asBool | ||
| 425 | stdio = args["stdio"].asBool | 461 | stdio = args["stdio"].asBool |
| 426 | onAllDeflated = args["all"].asBool | 462 | onAllDeflated = args["all"].asBool |
| 427 | onAllFiltered = args["filter"].asBool | 463 | onAllFiltered = args["filter"].asBool |
| 464 | +area = args["area"].asString | ||
| 428 | 465 | ||
| 429 | # Can't do verbose with -s, that messes up stdout, | 466 | # Can't do verbose with -s, that messes up stdout, |
| 430 | # read in all of stdin once and for all | 467 | # read in all of stdin once and for all |
| @@ -436,19 +473,23 @@ if stdio: | @@ -436,19 +473,23 @@ if stdio: | ||
| 436 | except: | 473 | except: |
| 437 | quit("Failed reading stdin", 1) | 474 | quit("Failed reading stdin", 1) |
| 438 | 475 | ||
| 439 | - | ||
| 440 | # Parse configuration files, may shadow and override each other | 476 | # Parse configuration files, may shadow and override each other |
| 441 | parseConfFile(currentDir / ".blimp.conf") | 477 | parseConfFile(currentDir / ".blimp.conf") |
| 442 | if not gitRootDir.isNil and gitRootDir != currentDir: | 478 | if not gitRootDir.isNil and gitRootDir != currentDir: |
| 443 | parseConfFile(gitRootDir / ".blimp.conf") | 479 | parseConfFile(gitRootDir / ".blimp.conf") |
| 444 | 480 | ||
| 481 | +if existsDir(homeDir / "blimpstore"): | ||
| 482 | + parseConfFile(homeDir / "blimpstore" / ".blimp.conf") | ||
| 483 | + | ||
| 484 | +parseConfFile(homeDir / ".blimp.conf") | ||
| 485 | + | ||
| 445 | # If we haven't gotten a blimpstore yet, we set a default one | 486 | # If we haven't gotten a blimpstore yet, we set a default one |
| 446 | if blimpStore.isNil: | 487 | if blimpStore.isNil: |
| 447 | blimpStore = homeDir / "blimpstore" | 488 | blimpStore = homeDir / "blimpstore" |
| 448 | 489 | ||
| 449 | -if existsDir(blimpStore): | ||
| 450 | - parseConfFile(blimpStore / ".blimp.conf") | ||
| 451 | -parseConfFile(homeDir / ".blimp.conf") | 490 | +# Check if we have a configured remoteArea |
| 491 | +if areas.hasKey(area): | ||
| 492 | + remoteArea = areas[area] | ||
| 452 | 493 | ||
| 453 | # Let's just show what we have :) | 494 | # Let's just show what we have :) |
| 454 | if verbose: dumpConfig() | 495 | if verbose: dumpConfig() |
| @@ -461,12 +502,8 @@ if args.showVersion: quit("blimp version: " & versionAsString) | @@ -461,12 +502,8 @@ if args.showVersion: quit("blimp version: " & versionAsString) | ||
| 461 | if not blimpVersion.isNil and blimpVersion != versionAsString: | 502 | if not blimpVersion.isNil and blimpVersion != versionAsString: |
| 462 | quit("Wrong version of blimp, configuration wants: " & blimpVersion) | 503 | quit("Wrong version of blimp, configuration wants: " & blimpVersion) |
| 463 | 504 | ||
| 464 | -# Should we install the filter? | ||
| 465 | -if args["init"].asBool: | ||
| 466 | - ensureBlimpFilter() | ||
| 467 | - if verbose: echo("Installed blimp filter") | ||
| 468 | 505 | ||
| 469 | -let command = args["command"].asString | 506 | +# Ok, let's see |
| 470 | var filenames = initSet[string]() | 507 | var filenames = initSet[string]() |
| 471 | 508 | ||
| 472 | # Add upp all files to operate on in a Set | 509 | # Add upp all files to operate on in a Set |
| @@ -484,9 +521,16 @@ if onAllFiltered: | @@ -484,9 +521,16 @@ if onAllFiltered: | ||
| 484 | # Make sure the local blimpstore is setup. | 521 | # Make sure the local blimpstore is setup. |
| 485 | setupBlimpStore() | 522 | setupBlimpStore() |
| 486 | 523 | ||
| 524 | + | ||
| 487 | # Do the deed | 525 | # Do the deed |
| 526 | +let command = args["command"].asString | ||
| 488 | if command != "": | 527 | if command != "": |
| 489 | - if command == "d" or command == "deflate": | 528 | + # Should we install the filter? |
| 529 | + if command == "init": | ||
| 530 | + ensureBlimpFilter() | ||
| 531 | + echo("Installed blimp filter") | ||
| 532 | + quit(0) | ||
| 533 | + elif command == "d" or command == "deflate": | ||
| 490 | for fn in filenames: | 534 | for fn in filenames: |
| 491 | deflate(fn) | 535 | deflate(fn) |
| 492 | elif command == "i" or command == "inflate": | 536 | elif command == "i" or command == "inflate": |
| @@ -495,12 +539,17 @@ if command != "": | @@ -495,12 +539,17 @@ if command != "": | ||
| 495 | elif command == "remove": | 539 | elif command == "remove": |
| 496 | for fn in filenames: | 540 | for fn in filenames: |
| 497 | remove(fn) | 541 | remove(fn) |
| 542 | + elif command == "push": | ||
| 543 | + for fn in filenames.items: | ||
| 544 | + push(fn) | ||
| 498 | elif command == "upload": | 545 | elif command == "upload": |
| 499 | - echo repr(filenames) | ||
| 500 | for fn in filenames.items: | 546 | for fn in filenames.items: |
| 501 | upload(fn) | 547 | upload(fn) |
| 548 | + elif command == "download": | ||
| 549 | + for fn in filenames.items: | ||
| 550 | + download(fn) | ||
| 502 | else: | 551 | else: |
| 503 | - quit("Unknown command: \"" & command & "\", only (d)eflate, (i)inflate, remove or upload are valid.", 6) | 552 | + quit("Unknown command: \"" & command & "\", use --help for valid commands.", 6) |
| 504 | 553 | ||
| 505 | # All good | 554 | # All good |
| 506 | quit(0) | 555 | quit(0) |
blimp.nimble
| 1 | [Package] | 1 | [Package] |
| 2 | name = "blimp" | 2 | name = "blimp" |
| 3 | -version = "0.3" | 3 | +version = "0.4" |
| 4 | author = "Göran Krampe" | 4 | author = "Göran Krampe" |
| 5 | description = "Utility that helps with big files in git, very similar to git-fat, s3annnex etc." | 5 | description = "Utility that helps with big files in git, very similar to git-fat, s3annnex etc." |
| 6 | license = "MIT" | 6 | license = "MIT" |