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 # 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 rsync like git-fat.
6 # It is a single binary without any dependencies. 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 const 10 const
32 versionMajor* = 0 11 versionMajor* = 0
@@ -189,7 +168,7 @@ proc remoteDeleteFile(blimpFilename: string) = @@ -189,7 +168,7 @@ proc remoteDeleteFile(blimpFilename: string) =
189 if errorCode != 0: 168 if errorCode != 0:
190 quit("Something went wrong deleting " & blimpFilename & " from " & remoteBlimpStore, 3) 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 proc copyToBlimpStore(filename, blimpFilename: string) = 172 proc copyToBlimpStore(filename, blimpFilename: string) =
194 if not existsFile(blimpStore / blimpFilename): 173 if not existsFile(blimpStore / blimpFilename):
195 if stdio: 174 if stdio:
@@ -200,6 +179,7 @@ proc copyToBlimpStore(filename, blimpFilename: string) = @@ -200,6 +179,7 @@ proc copyToBlimpStore(filename, blimpFilename: string) =
200 else: 179 else:
201 copyFile(filename, blimpStore / blimpFilename) 180 copyFile(filename, blimpStore / blimpFilename)
202 uploadFile(blimpFilename) 181 uploadFile(blimpFilename)
  182 +
203 183
204 # Copy content from blimpStore, and downloading first if needed 184 # Copy content from blimpStore, and downloading first if needed
205 proc copyFromBlimpStore(blimpFilename, filename: string) = 185 proc copyFromBlimpStore(blimpFilename, filename: string) =
@@ -227,7 +207,7 @@ proc blimpFileNameFromString(line: string): string = @@ -227,7 +207,7 @@ proc blimpFileNameFromString(line: string): string =
227 else: 207 else:
228 result = nil 208 result = nil
229 209
230 -# Pick out blimpFilename (filename & "-" & hash) 210 +# Pick out blimpFilename (filename & "-" & hash) or nil
231 proc blimpFileName(filename: string): string = 211 proc blimpFileName(filename: string): string =
232 if stdio: 212 if stdio:
233 blimpFileNameFromString(stdinContent) 213 blimpFileNameFromString(stdinContent)
@@ -299,6 +279,19 @@ proc remove(filename: string) = @@ -299,6 +279,19 @@ proc remove(filename: string) =
299 echo("\t" & filename & " content removed from blimpstore locally and remotely.") 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 proc setupBlimpStore() = 295 proc setupBlimpStore() =
303 try: 296 try:
304 if not existsDir(blimpStore): 297 if not existsDir(blimpStore):
@@ -333,7 +326,7 @@ let synopsis = &quot;&quot;&quot; @@ -333,7 +326,7 @@ let synopsis = &quot;&quot;&quot;
333 -v,--verbose Verbosity, only works without -s 326 -v,--verbose Verbosity, only works without -s
334 -i,--init Set blimp filter in git config 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 -a,--all Operate on all deflated files in clone 330 -a,--all Operate on all deflated files in clone
338 -f,--filter Operate on all files matching blimp filter 331 -f,--filter Operate on all files matching blimp filter
339 ---------- 332 ----------
@@ -341,6 +334,7 @@ let synopsis = &quot;&quot;&quot; @@ -341,6 +334,7 @@ let synopsis = &quot;&quot;&quot;
341 <filenames> (string...) One or more filepaths to inflate/deflate 334 <filenames> (string...) One or more filepaths to inflate/deflate
342 """ 335 """
343 let help = """ 336 let help = """
  337 +
344 blimp is a little utility program for handling large files 338 blimp is a little utility program for handling large files
345 in git repositories. Its inspired by git-fat and s3annex 339 in git repositories. Its inspired by git-fat and s3annex
346 but doesn't rely on S3 for storage - it uses rsync like git-fat. 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,9 +346,9 @@ let help = &quot;&quot;&quot;
352 Use "blimp d mybigfile" to deflate a file, typically before commit. 346 Use "blimp d mybigfile" to deflate a file, typically before commit.
353 Use "blimp i mybigfile" to inflate it back to original content. 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 "blimphash:" <filename> "-" <md5sum> 351 "blimphash:" <filename> "-" <md5sum>
357 - ...inside it.  
358 352
359 Deflate also copies the real content to your local blimpstore: 353 Deflate also copies the real content to your local blimpstore:
360 354
@@ -391,6 +385,10 @@ let help = &quot;&quot;&quot; @@ -391,6 +385,10 @@ let help = &quot;&quot;&quot;
391 the current content version, not older versions. The file itself is first 385 the current content version, not older versions. The file itself is first
392 inflated, if needed, and not deleted. This only "unblimps" the file. 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 In order to have blimp work automatically you can: 392 In order to have blimp work automatically you can:
395 393
396 * Create a .gitattributes file with lines like: 394 * Create a .gitattributes file with lines like:
@@ -408,7 +406,7 @@ let help = &quot;&quot;&quot; @@ -408,7 +406,7 @@ let help = &quot;&quot;&quot;
408 This means that if you clone a git repository that already has a .gitattributes 406 This means that if you clone a git repository that already has a .gitattributes
409 file in it that uses the blimp filter, then you should do: 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 This will configure the blimp filter and also find and inflate all deflated 411 This will configure the blimp filter and also find and inflate all deflated
414 files throughout the clone. 412 files throughout the clone.
@@ -469,9 +467,19 @@ if args[&quot;init&quot;].asBool: @@ -469,9 +467,19 @@ if args[&quot;init&quot;].asBool:
469 if verbose: echo("Installed blimp filter") 467 if verbose: echo("Installed blimp filter")
470 468
471 let command = args["command"].asString 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 if args.hasKey("filenames"): 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 # Make sure the local blimpstore is setup. 484 # Make sure the local blimpstore is setup.
477 setupBlimpStore() 485 setupBlimpStore()
@@ -479,27 +487,20 @@ setupBlimpStore() @@ -479,27 +487,20 @@ setupBlimpStore()
479 # Do the deed 487 # Do the deed
480 if command != "": 488 if command != "":
481 if command == "d" or command == "deflate": 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 elif command == "i" or command == "inflate": 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 elif command == "remove": 495 elif command == "remove":
499 for fn in filenames: 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 else: 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 # All good 505 # All good
505 quit(0) 506 quit(0)