Reply - Raw
#!/usr/bin/python
# -*- coding: utf8 -*-
#
# Filename: archive.py
# Copyright: Odd Stråbø <oddstr13@openshell.no>
# License: MIT - http://opensource.org/licenses/MIT
#

import sys
import os

class S(object):
    def __init__(self, s, multi=False):
        self.multi = multi
        self.s = s

    def __str__(self):
        return self.s

CC_SFX = """
local function extract(be, p)
  if p == nil then
    p = ""
  end
  if not fs.exists(p) then
    fs.makeDir(p)
  end
  for n,e in pairs(be) do
    local ep = fs.combine(p, n)
    if type(e) == "table" then
      print(ep .. "/")
      if fs.exists(ep) then
        error("Path exists on filesystem: " .. ep .. "/")
      end
      extract(e, ep)
    else
      print(ep)
      if fs.exists(ep) then
        error("Path exists on filesystem: " .. ep)
      end
      local fh = fs.open(ep, "w")
      fh.write(e)
      fh.close()
    end
  end
end
extract(data, ({...})[1])
"""

IGNORE = [
    ".hg",
    ".hgignore",
    ".git",
    ".gitignore",
]

def encodeString(s):
    if not '\n' in s:
        if not '"' in s:
            return S('"{s}"'.format(s=s))
        if not "'" in s:
            return S("'{s}'".format(s=s))

    sep = []
    while "]" + ''.join(sep) + "]" in s:
        sep.append("=")

    return S("[{sep}[{s}]{sep}]".format(s=s, sep=''.join(sep)), multi=True)

def encodeFile(path):
    with open(path, "rb") as fh:
        data = fh.read()
        name = encodeString(os.path.basename(path))
        if name.multi:
            return "[({name})]={data}".format(data=encodeString(data), name=name)
        else:
            return "[{name}]={data}".format(data=encodeString(data), name=name)

def encodePath(path):
    if os.path.isfile(path):
        files = [path]
    elif os.path.isdir(path):
        files = map(lambda x: os.path.join(path, x), os.listdir(path))

    content = []
    for fn in files:
        if os.path.isfile(fn):
            content.append(encodeFile(fn))
        if os.path.isdir(fn):
            content.append(encodePath(fn))

    name = encodeString(os.path.basename(path))
    if name.multi:
        return "[({name})]={{{data}}}".format(data=','.join(content), name=name)
    else:
        return "[{name}]={{{data}}}".format(data=','.join(content), name=name)

def archive(path):
    return "local data={{{data}}}\n".format(data=encodePath(path))

if len(sys.argv) != 2:
    print("Usage: {0} (<file>|<directory>)".format(sys.argv[0]))
else:
    print(archive(sys.argv[1]))
    print(CC_SFX)