Commit 3e2f4c1467d355cce492bde32a2de9ad48564114

Authored by Göran Krampe
1 parent ec7d9613

Added upload command, made file specifications use a set.

Showing 1 changed file with 49 additions and 48 deletions
blimp.nim
1   -import md5, os, osproc, parseopt2, strutils, parsecfg, streams, lapp, subexes, tables
  1 +import md5, os, osproc, parseopt2, strutils, parsecfg, streams, lapp, subexes, tables, sets
2 2  
3 3 # blimp is a little utility program for handling large files
4 4 # in git repositories. Its inspired by git-fat and s3annex
5 5 # but doesn't rely on S3 for storage - it uses rsync like git-fat.
6 6 # It is a single binary without any dependencies.
7 7 #
8   -# Manual use:
9   -#
10   -# Use "blimp d mybigfile" to deflate it before commit.
11   -# Use "blimp i mybigfile" to inflate it back to original size.
12   -#
13   -# When deflated the file only has:
14   -# "blimphash:" <filename> + <an md5sum>
15   -# ...inside it.
16   -#
17   -# The file is copied over to a local dir:
18   -# <blimpstore>/<filename>-<md5sum>
19   -#
20   -# Configuration is in these locations in order:
21   -#
22   -# ./.blimp.conf
23   -# <gitroot>/.blimp.conf
24   -# ~/<blimpstore>/.blimp.conf
25   -# ~/.blimp.conf
26   -#
27   -# This way you can have settings per directory, per git clone,
28   -# per store and per user. A default blimpstore with a commented .blimp.conf
29   -# is created in ~/blimpstore if you run blimp and no .blimp.conf is found.
  8 +# Just run blimp --help for detailed help.
30 9  
31 10 const
32 11 versionMajor* = 0
... ... @@ -189,7 +168,7 @@ proc remoteDeleteFile(blimpFilename: string) =
189 168 if errorCode != 0:
190 169 quit("Something went wrong deleting " & blimpFilename & " from " & remoteBlimpStore, 3)
191 170  
192   -# Copy content to blimpStore, no upload yet.
  171 +# Copy content to blimpStore and upload if it was a new file or upload == true.
193 172 proc copyToBlimpStore(filename, blimpFilename: string) =
194 173 if not existsFile(blimpStore / blimpFilename):
195 174 if stdio:
... ... @@ -200,6 +179,7 @@ proc copyToBlimpStore(filename, blimpFilename: string) =
200 179 else:
201 180 copyFile(filename, blimpStore / blimpFilename)
202 181 uploadFile(blimpFilename)
  182 +
203 183  
204 184 # Copy content from blimpStore, and downloading first if needed
205 185 proc copyFromBlimpStore(blimpFilename, filename: string) =
... ... @@ -227,7 +207,7 @@ proc blimpFileNameFromString(line: string): string =
227 207 else:
228 208 result = nil
229 209  
230   -# Pick out blimpFilename (filename & "-" & hash)
  210 +# Pick out blimpFilename (filename & "-" & hash) or nil
231 211 proc blimpFileName(filename: string): string =
232 212 if stdio:
233 213 blimpFileNameFromString(stdinContent)
... ... @@ -299,6 +279,19 @@ proc remove(filename: string) =
299 279 echo("\t" & filename & " content removed from blimpstore locally and remotely.")
300 280  
301 281  
  282 +# Copy original file to blimpStore and replace with hash stub in git.
  283 +proc upload(filename: string) =
  284 + if verbose: echo "Uploading " & filename
  285 + var blimpFilename = blimpFilename(filename)
  286 + if blimpFilename.isNil:
  287 + blimpFilename = computeBlimpFilename(filename)
  288 + if existsFile(blimpStore / blimpFilename):
  289 + uploadFile(blimpFilename)
  290 + if verbose: echo("\t" & filename & " uploaded.")
  291 + else:
  292 + if verbose: echo("\t" & filename & " is not in blimpstore, skipping.")
  293 +
  294 +
302 295 proc setupBlimpStore() =
303 296 try:
304 297 if not existsDir(blimpStore):
... ... @@ -333,7 +326,7 @@ let synopsis = &quot;&quot;&quot;
333 326 -v,--verbose Verbosity, only works without -s
334 327 -i,--init Set blimp filter in git config
335 328 ----------
336   - <command> (string) (d)eflate, (i)nflate, remove
  329 + <command> (string) (d)eflate, (i)nflate, remove, upload
337 330 -a,--all Operate on all deflated files in clone
338 331 -f,--filter Operate on all files matching blimp filter
339 332 ----------
... ... @@ -341,6 +334,7 @@ let synopsis = &quot;&quot;&quot;
341 334 <filenames> (string...) One or more filepaths to inflate/deflate
342 335 """
343 336 let help = """
  337 +
344 338 blimp is a little utility program for handling large files
345 339 in git repositories. Its inspired by git-fat and s3annex
346 340 but doesn't rely on S3 for storage - it uses rsync like git-fat.
... ... @@ -352,9 +346,9 @@ let help = &quot;&quot;&quot;
352 346 Use "blimp d mybigfile" to deflate a file, typically before commit.
353 347 Use "blimp i mybigfile" to inflate it back to original content.
354 348  
355   - When deflated the file only has:
  349 + When deflated the file only has this content:
  350 +
356 351 "blimphash:" <filename> "-" <md5sum>
357   - ...inside it.
358 352  
359 353 Deflate also copies the real content to your local blimpstore:
360 354  
... ... @@ -391,6 +385,10 @@ let help = &quot;&quot;&quot;
391 385 the current content version, not older versions. The file itself is first
392 386 inflated, if needed, and not deleted. This only "unblimps" the file.
393 387  
  388 + The upload command (no single character shortcut) will upload the given file
  389 + 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.
  391 +
394 392 In order to have blimp work automatically you can:
395 393  
396 394 * Create a .gitattributes file with lines like:
... ... @@ -408,7 +406,7 @@ let help = &quot;&quot;&quot;
408 406 This means that if you clone a git repository that already has a .gitattributes
409 407 file in it that uses the blimp filter, then you should do:
410 408  
411   - blimp --init inflate --all
  409 + blimp --init inflate --filter
412 410  
413 411 This will configure the blimp filter and also find and inflate all deflated
414 412 files throughout the clone.
... ... @@ -469,9 +467,19 @@ if args[&quot;init&quot;].asBool:
469 467 if verbose: echo("Installed blimp filter")
470 468  
471 469 let command = args["command"].asString
472   -var filenames: seq[PValue]
  470 +var filenames = initSet[string]()
  471 +
  472 +# Add upp all files to operate on in a Set
473 473 if args.hasKey("filenames"):
474   - filenames = args["filenames"].asSeq
  474 + for f in args["filenames"].asSeq:
  475 + if f.asString != "":
  476 + filenames.incl(f.asString)
  477 +if onAllDeflated:
  478 + for fn in allDeflated():
  479 + filenames.incl(fn)
  480 +if onAllFiltered:
  481 + for fn in allFiltered():
  482 + filenames.incl(fn)
475 483  
476 484 # Make sure the local blimpstore is setup.
477 485 setupBlimpStore()
... ... @@ -479,27 +487,20 @@ setupBlimpStore()
479 487 # Do the deed
480 488 if command != "":
481 489 if command == "d" or command == "deflate":
482   - if onAllFiltered:
483   - for fn in allFiltered():
484   - deflate(fn)
485   - else:
486   - for fn in filenames:
487   - deflate(fn.asString)
  490 + for fn in filenames:
  491 + deflate(fn)
488 492 elif command == "i" or command == "inflate":
489   - if onAllDeflated:
490   - for fn in allDeflated():
491   - inflate(fn)
492   - elif onAllFiltered:
493   - for fn in allFiltered():
494   - inflate(fn)
495   - else:
496   - for fn in filenames:
497   - inflate(fn.asString)
  493 + for fn in filenames:
  494 + inflate(fn)
498 495 elif command == "remove":
499 496 for fn in filenames:
500   - remove(fn.asString)
  497 + remove(fn)
  498 + elif command == "upload":
  499 + echo repr(filenames)
  500 + for fn in filenames.items:
  501 + upload(fn)
501 502 else:
502   - quit("Unknown command, only (d)eflate, (i)inflate or remove are valid.", 6)
  503 + quit("Unknown command: \"" & command & "\", only (d)eflate, (i)inflate, remove or upload are valid.", 6)
503 504  
504 505 # All good
505 506 quit(0)
... ...