summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rwxr-xr-xkoch.nim20
-rwxr-xr-xlib/impure/zipfiles.nim22
2 files changed, 42 insertions, 0 deletions
diff --git a/koch.nim b/koch.nim
index d3caa27df..2e67cd3d4 100755
--- a/koch.nim
+++ b/koch.nim
@@ -34,6 +34,7 @@ Possible Commands:
   zip                      builds the installation ZIP package
   inno [options]           builds the Inno Setup installer (for Windows)
   tests                    run the testsuite
+  update                   updates nimrod to the latest version from the repo.	
 Boot options:
   -d:release               produce a release version of the compiler
   -d:tinyc                 include the Tiny C backend (not supported on Windows)
@@ -78,6 +79,24 @@ proc web(args: string) =
   exec("nimrod cc -r tools/nimweb.nim web/nimrod --putenv:nimrodversion=$#" %
        NimrodVersion)
 
+proc update(args: string) =
+  if ExistFile("./.git"):
+    # use git to download latest source
+    exec("git pull")
+  else:
+    # use dom96's httpclient to download zip
+    import httpclient
+    import zipfiles
+    downloadFile("https://github.com/Araq/Nimrod/zipball/master","./update.zip")
+    
+    var zip :TZipArchive
+    discard open(zip,fmRead) # will add error checking later
+    extractAll(zip,"./")
+
+  exec("./koch boot -d:release")
+
+
+
 # -------------- boot ---------------------------------------------------------
 
 const
@@ -204,6 +223,7 @@ of cmdArgument:
   of "inno": inno(op.cmdLineRest)
   of "install": install(op.cmdLineRest)
   of "test", "tests": tests(op.cmdLineRest)
+  of "update", "up": update(op.cmdLineRest)
   else: showHelp()
 of cmdEnd: showHelp()
 
diff --git a/lib/impure/zipfiles.nim b/lib/impure/zipfiles.nim
index bdefc2c93..bf26f93bf 100755
--- a/lib/impure/zipfiles.nim
+++ b/lib/impure/zipfiles.nim
@@ -142,3 +142,25 @@ iterator walkFiles*(z: var TZipArchive): string =
   while i < num:
     yield $zip_get_name(z.w, i, 0'i32)
     inc(i)
+
+
+proc extractFile*(z: var TZipArchive, srcFile: string, dest: PStream) =
+  var strm = getStream(z, srcFile)
+  while true:
+    if not strm.atEnd:
+        dest.write(strm.readStr(1))
+    else: break
+  dest.flush()
+  strm.close()
+  dest.close()
+
+proc extractFile*(z: var TZipArchive, srcFile: string, dest: string) =
+  var file = newFileStream(dest, fmReadWrite)
+  extractFile(z, srcFile, file)
+
+proc extractAll*(z: var TZipArchive, dest: string) =
+  for file in walkFiles(z):
+    extractFile(z, file, dest & "/" & extractFilename(file))
+
+   
+   
\ No newline at end of file