Commit ec7d961359cabb631d7769eb90aacd5d6d7d0262

Authored by Göran Krampe
1 parent 14d16aa7

Added option --filter and fixed some bugs.

Showing 1 changed file with 26 additions and 11 deletions
blimp.nim
... ... @@ -37,7 +37,7 @@ const
37 37 var
38 38 blimpStore, remoteBlimpStore, uploadCommandFormat, downloadCommandFormat, deleteCommandFormat, rsyncPassword, blimpVersion: string = nil
39 39 homeDir, currentDir, gitRootDir: string
40   - verbose, stdio, inflateAll: bool
  40 + verbose, stdio, onAllDeflated, onAllFiltered: bool
41 41 stdinContent: string = nil
42 42  
43 43 let
... ... @@ -69,10 +69,8 @@ delete = "rsync --password-file $3/.blimp.pass -dv --delete --existing --ignore-
69 69  
70 70 [blimp]
71 71 # Minimal version, otherwise stop
72   -# version = 0.2
73   -"""
  72 +# version = """ & versionAsString
74 73  
75   -
76 74  
77 75 proc cmd(cmd: string): string =
78 76 try:
... ... @@ -201,7 +199,7 @@ proc copyToBlimpStore(filename, blimpFilename: string) =
201 199 quit("Failed writing file: " & blimpStore / blimpFilename & " from stdin", 1)
202 200 else:
203 201 copyFile(filename, blimpStore / blimpFilename)
204   - uploadFile(blimpFilename)
  202 + uploadFile(blimpFilename)
205 203  
206 204 # Copy content from blimpStore, and downloading first if needed
207 205 proc copyFromBlimpStore(blimpFilename, filename: string) =
... ... @@ -270,6 +268,14 @@ iterator allDeflated() =
270 268 for fn in filenames:
271 269 if not blimpFilename(fn).isNil:
272 270 yield fn
  271 +
  272 +# Iterator over all files matching the blimp filter in the git clone
  273 +iterator allFiltered() =
  274 + let lines = cmd("git ls-files | git check-attr --stdin filter").split('\l')
  275 + for line in lines:
  276 + let status = line.split(':')
  277 + if strip(status[2]) == "blimp":
  278 + yield status[0]
273 279  
274 280 # Parse out hash from hash stub and copy back original content from blimpStore.
275 281 proc inflate(filename: string) =
... ... @@ -329,6 +335,7 @@ let synopsis = """
329 335 ----------
330 336 <command> (string) (d)eflate, (i)nflate, remove
331 337 -a,--all Operate on all deflated files in clone
  338 + -f,--filter Operate on all files matching blimp filter
332 339 ----------
333 340 -s,--stdio If given, use stdin/stdout for content.
334 341 <filenames> (string...) One or more filepaths to inflate/deflate
... ... @@ -387,7 +394,7 @@ let help = &quot;&quot;&quot;
387 394 In order to have blimp work automatically you can:
388 395  
389 396 * Create a .gitattributes file with lines like:
390   - *.png filter=blimp -text
  397 + *.png filter=blimp binary
391 398  
392 399 * Configure blimp as a filter by running:
393 400 git config filter.blimp.clean "blimp -s d %f"
... ... @@ -418,7 +425,8 @@ gitRootDir = gitRoot()
418 425 var args = parse(synopsis)
419 426 verbose = args["verbose"].asBool
420 427 stdio = args["stdio"].asBool
421   -inflateAll = args["all"].asBool
  428 +onAllDeflated = args["all"].asBool
  429 +onAllFiltered = args["filter"].asBool
422 430  
423 431 # Can't do verbose with -s, that messes up stdout,
424 432 # read in all of stdin once and for all
... ... @@ -471,12 +479,19 @@ setupBlimpStore()
471 479 # Do the deed
472 480 if command != "":
473 481 if command == "d" or command == "deflate":
474   - for fn in filenames:
475   - deflate(fn.asString)
  482 + if onAllFiltered:
  483 + for fn in allFiltered():
  484 + deflate(fn)
  485 + else:
  486 + for fn in filenames:
  487 + deflate(fn.asString)
476 488 elif command == "i" or command == "inflate":
477   - if inflateAll:
  489 + if onAllDeflated:
478 490 for fn in allDeflated():
479 491 inflate(fn)
  492 + elif onAllFiltered:
  493 + for fn in allFiltered():
  494 + inflate(fn)
480 495 else:
481 496 for fn in filenames:
482 497 inflate(fn.asString)
... ... @@ -484,7 +499,7 @@ if command != &quot;&quot;:
484 499 for fn in filenames:
485 500 remove(fn.asString)
486 501 else:
487   - quit("Unknown command, only (d)eflate or (i)inflate are valid.", 6)
  502 + quit("Unknown command, only (d)eflate, (i)inflate or remove are valid.", 6)
488 503  
489 504 # All good
490 505 quit(0)
... ...