Commit 6884d53440fa3fd4baddf307b5f2e879d5a69917
1 parent
f9e9a47e
Fixed unixy path on win32, improved .blimp.conf template.
Showing
1 changed file
with
51 additions
and
25 deletions
blimp.nim
@@ -2,7 +2,7 @@ import md5, os, osproc, parseopt2, strutils, parsecfg, streams, lapp, subexes, t | @@ -2,7 +2,7 @@ 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 sftp but | 5 | +# but doesn't rely on S3 for storage - it uses scp but |
6 | # performs the file operations using externally configured commands. | 6 | # performs the file operations using externally configured commands. |
7 | # It is a single binary without any dependencies. | 7 | # It is a single binary without any dependencies. |
8 | # | 8 | # |
@@ -34,13 +34,14 @@ var | @@ -34,13 +34,14 @@ var | ||
34 | areas = newTable[string, RemoteArea]() | 34 | areas = newTable[string, RemoteArea]() |
35 | remoteArea: RemoteArea | 35 | remoteArea: RemoteArea |
36 | 36 | ||
37 | -let | ||
38 | - defaultConfig = """ | 37 | +let defaultConfig = """ |
39 | [blimp] | 38 | [blimp] |
40 | # Minimal version, otherwise stop | 39 | # Minimal version, otherwise stop |
41 | # version = """ & versionAsString & """ | 40 | # version = """ & versionAsString & """ |
42 | - | ||
43 | -# Set your local blimpstore directory. You can use %home%, %cwd% and %gitroot% in paths, works cross platform. | 41 | +# |
42 | +# Set your local blimpstore directory. You can use %home%, | ||
43 | +# %cwd% and %gitroot% in paths, works cross platform. | ||
44 | +# | ||
44 | # Example: | 45 | # Example: |
45 | # # Place it inside the git clone | 46 | # # Place it inside the git clone |
46 | # blimpstore = "%gitroot%/.git/blimpstore" | 47 | # blimpstore = "%gitroot%/.git/blimpstore" |
@@ -50,21 +51,36 @@ let | @@ -50,21 +51,36 @@ let | ||
50 | # | 51 | # |
51 | # Default: | 52 | # Default: |
52 | # # Place it in the users home directory | 53 | # # Place it in the users home directory |
53 | -# blimpstore = "%home%/blimpstore" | ||
54 | - | ||
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/" | ||
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 | -""" | 54 | +blimpstore = "%home%/blimpstore" |
55 | + | ||
56 | + | ||
57 | +[remote] | ||
58 | +# The "remote" area represents the shared remote blimpstore. | ||
59 | +# This area is the default area used unless --area is used. | ||
60 | +url = "blimp@build.3dicc.com:/var/opt/blimpstore" | ||
61 | + | ||
62 | +# On Windows we rely on msysgit that includes scp. | ||
63 | +# On XP, make sure to put your ssh keys | ||
64 | +# in c:\Program Files\git\.ssh (slightly odd place) | ||
65 | +# On Win7 it uses c:\Users\gokr\.ssh - you can check with | ||
66 | +# "ssh -v somehost" to see where it looks for the keys. | ||
67 | +# | ||
68 | +# When expanding the command templates below: | ||
69 | +# $1 is the blimp filename | ||
70 | +# $2 is the area url above | ||
71 | +# $3 is the local blimpstore directory | ||
72 | +upload = "scp -pq '$3/$1' '$2/'" | ||
73 | +download = "scp -pq '$2/$1' '$3/'" | ||
74 | + | ||
75 | + | ||
76 | +[release] | ||
77 | +# This area can be used with upload/download commands and --area option. | ||
78 | +# -r makes it possible to give directories as arguments for recursive handling. | ||
79 | +url = "blimp@build.3dicc.com:/var/opt/release" | ||
80 | +upload = "scp -r '$3/$1' '$2/'" | ||
81 | +download = "scp -r '$2/$1' '$3/'" | ||
82 | +""" | ||
83 | + | ||
68 | 84 | ||
69 | proc cmd(cmd: string): string = | 85 | proc cmd(cmd: string): string = |
70 | try: | 86 | try: |
@@ -133,7 +149,7 @@ proc parseConfFile(filename: string) = | @@ -133,7 +149,7 @@ proc parseConfFile(filename: string) = | ||
133 | of "blimp": | 149 | of "blimp": |
134 | case e.key | 150 | case e.key |
135 | of "blimpstore": | 151 | of "blimpstore": |
136 | - if blimpStore.isNil: blimpStore = e.value | 152 | + if blimpStore.isNil: blimpStore = expandDirs(e.value) |
137 | of "version": | 153 | of "version": |
138 | if blimpVersion.isNil: blimpVersion = e.value | 154 | if blimpVersion.isNil: blimpVersion = e.value |
139 | else: | 155 | else: |
@@ -165,13 +181,24 @@ proc run(cmd: string): int = | @@ -165,13 +181,24 @@ proc run(cmd: string): int = | ||
165 | if verbose: echo(cmd) | 181 | if verbose: echo(cmd) |
166 | execCmd(cmd) | 182 | execCmd(cmd) |
167 | 183 | ||
184 | +# Perhaps not perfect but tries to convert c:\foo\bar to /c/foo/bar | ||
185 | +# but only if we are on windows, otherwise we do nothing. | ||
186 | +proc toUnixyPath(path: string): string = | ||
187 | + when defined(windows): | ||
188 | + if path.len > 1 and path[1] == ':': | ||
189 | + let parts = path.split({':', '\\'}) | ||
190 | + result = "/" & parts.join("/") | ||
191 | + else: | ||
192 | + result = path | ||
193 | + else: | ||
194 | + result = path | ||
168 | 195 | ||
169 | # Upload a file to the remote area | 196 | # Upload a file to the remote area |
170 | proc uploadFile(filename, fromDir: string) = | 197 | proc uploadFile(filename, fromDir: string) = |
171 | if remoteArea.isNil: | 198 | if remoteArea.isNil: |
172 | echo("Remote area not set in configuration file, skipping uploading content:\n\t" & filename) | 199 | echo("Remote area not set in configuration file, skipping uploading content:\n\t" & filename) |
173 | return | 200 | return |
174 | - let errorCode = run(format(remoteArea.upload, filename, remoteArea.url, fromDir)) | 201 | + let errorCode = run(format(remoteArea.upload, filename, remoteArea.url, toUnixyPath(fromDir))) |
175 | if errorCode != 0: | 202 | if errorCode != 0: |
176 | quit("Something went wrong uploading " & filename & " to " & remoteArea.url, 2) | 203 | quit("Something went wrong uploading " & filename & " to " & remoteArea.url, 2) |
177 | 204 | ||
@@ -179,7 +206,7 @@ proc uploadFile(filename, fromDir: string) = | @@ -179,7 +206,7 @@ proc uploadFile(filename, fromDir: string) = | ||
179 | proc downloadFile(filename, toDir: string) = | 206 | proc downloadFile(filename, toDir: string) = |
180 | if remoteArea.isNil: | 207 | if remoteArea.isNil: |
181 | quit("Remote area not set in configuration file, can not download content:\n\t" & filename) | 208 | 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)) | 209 | + let errorCode = run(format(remoteArea.download, filename, remoteArea.url, toUnixyPath(toDir))) |
183 | if errorCode != 0: | 210 | if errorCode != 0: |
184 | quit("Something went wrong downloading " & filename & " from " & remoteArea.url, 3) | 211 | quit("Something went wrong downloading " & filename & " from " & remoteArea.url, 3) |
185 | 212 | ||
@@ -187,7 +214,7 @@ proc downloadFile(filename, toDir: string) = | @@ -187,7 +214,7 @@ proc downloadFile(filename, toDir: string) = | ||
187 | proc remoteDeleteFile(filename: string) = | 214 | proc remoteDeleteFile(filename: string) = |
188 | if remoteArea.isNil: | 215 | if remoteArea.isNil: |
189 | return | 216 | return |
190 | - let errorCode = run(format(remoteArea.delete, filename, remoteArea.url, blimpStore)) | 217 | + let errorCode = run(format(remoteArea.delete, filename, remoteArea.url, toUnixyPath(blimpStore))) |
191 | if errorCode != 0: | 218 | if errorCode != 0: |
192 | quit("Something went wrong deleting " & filename & " from " & remoteArea.url, 3) | 219 | quit("Something went wrong deleting " & filename & " from " & remoteArea.url, 3) |
193 | 220 | ||
@@ -454,7 +481,6 @@ homeDir = getHomeDir() | @@ -454,7 +481,6 @@ homeDir = getHomeDir() | ||
454 | homeDir = homeDir[0.. -2] # Not sure why it keeps a trailing "/" on Linux | 481 | homeDir = homeDir[0.. -2] # Not sure why it keeps a trailing "/" on Linux |
455 | currentDir = getCurrentDir() | 482 | currentDir = getCurrentDir() |
456 | gitRootDir = gitRoot() | 483 | gitRootDir = gitRoot() |
457 | -echo gitRootDir | ||
458 | 484 | ||
459 | # Using lapp to get args, on parsing failure this will show usage automatically | 485 | # Using lapp to get args, on parsing failure this will show usage automatically |
460 | var args = parse(synopsis) | 486 | var args = parse(synopsis) |