{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-server/src/httpServer.js"],"names":["http","httpProxy","fs","URL","Path","mime","mkdirp","argv","exec","slash","utils","cleanString","run","respondWithCMD","Promise","fetch","fs_exists","file","resolve","exists","fs_stat","promisify","stat","try_fs_stat","e","fs_readdir","readdir","fs_writeFile","args","writeFile","err","fs_readFile","reject","readFile","data","console","log","logRequest","req","_logId","Lively4bootfilelistName","Lively4bundleName","Lively4transpileDir","Lively4optionsDir","GithubOriganizationMemberCache","RepositoryBootfiles","RepositoryInSync","MakeInProgress","breakOutRegex","RegExp","isTextRegEx","Server","optionsSpec","name","short","type","description","example","setup","port","server","lively4dir","path","autoCommit","bool","start","options","myurl","tmpStorage","requestCounter","proxy","createProxyServer","createServer","res","onRequest","listen","sourceDir","setCORSHeaders","setHeader","_startTime","Date","now","method","url","debugInitiator","headers","debugSession","debugSystem","startRequestTime","parse","pathname","replace","decodeURI","normalize","fileversion","m","match","repositorypath","join","filepath","org","teamName","username","password","writeHead","end","authorizationKey","lastAuthorization","success","teamInfo","Authorization","then","r","json","members_url","members","userInTeam","map","ea","login","includes","time","previous","test","TMP","BP2019Proxy","web","target","META","WEBHOOK","GIT","GRAPHVIZ","MAKE","SEARCH","GET","PUT","DELETE","MKCOL","OPTIONS","MOVE","error","Math","round","ensureBundleFile","readFileVersion","hashFilepath","bundleFilepath","bundleFile","ensureDirectory","optionsDir","transpileDir","bootlist","relativeBootFiles","relativeOptionFiles","relativeTranspileFiles","hashed","Map","split","filehash","set","stats","optionsFile","transpileFile","transpileMapFile","push","optionsStats","mtime","updatedOptions","readOptions","JSON","stringify","transpileStats","deletePath","transpileMapStats","quoteList","list","cmd","result","undefined","isInBootfile","stdout","stderr","lookup","invalidateBundleFile","deleteBundleFile","ensureSpecialParentDirectories","invalidateOptionsFile","hashedpath","invalidateTranspiledFile","fullpath","isDirectory","readDirectory","getVersion","modified","getLastModified","stream","createReadStream","bufferSize","on","pipe","aPath","contentType","files","dir","contents","checkEnd","length","prefix","sort","forEach","filename","filePath","statObj","size","fullBody","setEncoding","chunk","toString","lastVersion","currentVersion","conflictversion","Error","gitusername","email","gitemail","authCmd","body","ensureCachedOptions","version","optionsBody","optionsPath","written","transpilePath","moveResource","source","destination","re","directory","substr","after","until","code","listVersions","readFilelist","isFile","line","row","filter","format","range","process","exit","sPath","cb","dryrun","repository","repositoryurl","branch","msg","gitcommit","usecolor","versionA","versionB","lively4DirUnix","commit","pattern","rootdirs","excludes","setTimeout","tempFile","layout","params","query","webhookListeners","key","Set","add","response","full_name","listeners","Array","from","delete","option","indexFiles","bashBin","config","module","parent","exports"],"mappings":"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","file":"httpServer.js","sourcesContent":["/*\n * # Lively4 Server -- a file server that serves and manages git repositories as REST\n *\n * ## Supported methods:\n * - GET\n * - PUT\n * - DELETE\n * - MKCOL\n * - OPTIONS\n *   - filelist\n *   - showversions\n *   - default: modified, type, name\n *\n * ## Special request HEADER\n * - fileversion\n */\n\nimport http from 'http';\nimport httpProxy from 'http-proxy';\nimport fs from 'fs';\nimport URL from 'url';\nimport Path from 'path';\nimport mime from 'mime';\nimport mkdirp from 'mkdirp';\nimport argv from 'argv';\nimport { exec } from 'child_process';\nimport slash from 'slash'; // Convert Windows backslash paths to slash paths: foo\\\\bar ➔ foo/bar\nimport 'log-timestamp'; // // this adds a timestamp to all log messages\nimport * as utils from './utils.js';\nimport { cleanString, run, respondWithCMD } from './utils.js';\n\nimport Promise from 'bluebird'; // seems not to workd\n// e.g. this did not work var statFile = Promise.promisify(fs.stat);\n// var fs_exists = Prom.promisify(fs.exists);\n// but this does\n\nimport fetch from 'node-fetch';\n\nvar fs_exists = function(file) {\n  return new Promise(resolve =>\n    fs.exists(file, exists => {\n      resolve(exists); // there seems to be an issue here, so we do it very explictly\n    })\n  );\n};\n\nvar fs_stat = Promise.promisify(fs.stat);\nasync function try_fs_stat(file){\n  try {\n    return await fs_stat(file)\n  } catch(e) {\n    return null\n  }\n}\n\nvar fs_readdir = function(file) {\n  return new Promise(resolve => fs.readdir(file, resolve));\n};\n\nvar fs_writeFile = function(...args) {\n  return new Promise(resolve => fs.writeFile(args[0], args[1], args[2], (err) => resolve({err: err}) ))\n};\n\nvar fs_readFile = function(file) {\n  return new Promise((resolve, reject) => fs.readFile(file, \"utf8\", (err, data) => {\n    if (err) {\n      reject(err)\n    } else {\n      resolve(data)\n    }\n  }))\n};\n\n\nfs.readFile('/etc/passwd', (err, data) => {\n  if (err) throw err;\n  console.log(data);\n});\n\n// var readFile = Promise.promisify(fs.readFile);\n// var readDir = Promise.promisify(fs.readdir);\n\nexport function log(...args) {\n  console.log('[server]', ...args);\n}\n\n\n// #UseCase #ContextJS #AsyncContext it is really hard to hand down the request object into all methods, just so they can log properly...\nexport function logRequest(req, ...args) {\n  log(\"REQUEST[\" +req._logId + \"] \",...args);\n}\n\n\nconst Lively4bootfilelistName = \".lively4bootfilelist\"\nconst Lively4bundleName = \".lively4bundle.zip\"\nconst Lively4transpileDir = \".transpiled\"\nconst Lively4optionsDir = \".options\"\n\nconst GithubOriganizationMemberCache = {}\n\nvar RepositoryBootfiles = {}\n\nvar RepositoryInSync = {}; // cheap semaphore\nvar MakeInProgress = {}; // cheap semaphore\n\nvar breakOutRegex = new RegExp('/*\\\\/\\\\.\\\\.\\\\/*/');\nvar isTextRegEx = /\\.((txt)|(md)|(js)|(html)|(svg))$/;\n\nclass Server {\n  static get optionsSpec() {\n    return [\n      {\n        name: 'port',\n        short: 'p',\n        type: 'int',\n        description: 'port on which the server will listen for connections',\n        example:\n          \"'node httpServer.js -p 8001' or 'node httpServer.js --port=8001'\"\n      },\n      {\n        name: 'directory',\n        short: 'd',\n        type: 'path',\n        description: 'root directory from which the server will serve files',\n        example:\n          \"'node httpServer.js -d ../foo/bar' or node httpServer.js --directory=../foo/bar'\"\n      },\n      {\n        name: 'server',\n        type: 'path',\n        description: 'directory where the server looks for its scripts',\n        example: \"'node httpServer.js --server ~/lively4-server'\"\n      },\n      {\n        name: 'auto-commit',\n        type: 'boolean',\n        description: 'auto commit on every PUT file',\n        example: \"'node --auto-commit=true'\"\n      },\n      {\n        name: 'bash-bin',\n        type: 'string',\n        description: 'path to bash executable',\n        example: \"'node --bash-bin=\\\\cygwin64\\\\bin\\\\bash.exe'\"\n      },\n      {\n        name: 'lively4dir-unix',\n        type: 'string',\n        description: 'the directory in cygwin.'\n      },\n      {\n        name: 'authorize-requests',\n        type: 'boolean',\n        description: 'authorize every request by authenticating a user and checking if in github team'\n      },\n      {\n        name: 'github-organization',\n        type: 'string',\n        description: 'github organization'\n      },\n      {\n        name: 'github-team',\n        type: 'string',\n        description: 'github team'\n      },\n      {\n        name: 'myurl',\n        type: 'string',\n        description: 'myurl from the outside...'\n      }\n    ];\n  }\n\n  static setup() {\n    this.port = port;\n    this.server = server;\n  }\n\n  static get lively4dir() {\n    return lively4dir;\n  }\n\n  static set lively4dir(path) {\n    log('set lively4dir to:' + path);\n    sourceDir = path;\n    lively4dir = path;\n    lively4DirUnix = path;\n    return lively4dir;\n  }\n\n  static get autoCommit() {\n    return autoCommit;\n  }\n\n  static set autoCommit(bool) {\n    log('set autoCommit to: ' + bool);\n    return (autoCommit = bool);\n  }\n  \n\n  static start() {\n    log('Welcome to Lively4!');\n    log('Server: ' + this.server);\n    log('Lively4: ' + lively4dir);\n    log('Port: ' + this.port);\n    log('Auto-commit: ' + autoCommit);\n    log('Myurl: ' + Server.options.myurl);\n\n    this.tmpStorage = {};\n    this.requestCounter = 0\n    \n    \n    var proxy = httpProxy.createProxyServer({});\n\n    http\n      .createServer((req, res) => this.onRequest(req, res, proxy))\n      .listen(this.port, function(err) {\n        if (err) {\n          throw err;\n        }\n\n        log('Server running on port ' + port + ' in directory ' + sourceDir);\n      });\n  }\n\n  static setCORSHeaders(res) {\n    res.setHeader('Access-Control-Allow-Origin', '*');\n    res.setHeader('Access-Control-Request-Method', '*');\n    res.setHeader('Access-Control-Allow-Methods', 'OPTIONS, GET, DELETE, PUT');\n    res.setHeader('Access-Control-Allow-Headers', '*');\n  }\n\n  static async onRequest(req, res, proxy) {\n    req._logId = this.requestCounter++\n    req._startTime = Date.now()\n    logRequest(req, \"START \" + req.method + \"\\t\" + req.url)\n    try {\n      var debugInitiator = req.headers['debug-initiator'];\n      if (debugInitiator) {\n        logRequest(req, \"INITIATOR \" + debugInitiator)\n      }\n      var debugSession = req.headers['debug-session'];\n      if (debugSession) {\n        logRequest(req, \"SESSION \" + debugSession)\n      }\n\n      var debugSystem = req.headers['debug-system'];\n      if (debugSystem) {\n        logRequest(req, \"SYSTEM \" + debugSystem)\n      }\n\n      var startRequestTime = Date.now()\n\n\n      try {\n        this.setCORSHeaders(res);\n\n        // url =  new URL(\"https://lively-kernel.org/lively4/lively4-jens/src/client/boot.js\")\n        var url = URL.parse(req.url, true, false);\n        var pathname = url.pathname;// /lively4/lively4-jens/src/client/boot.js\n\n        pathname = pathname.replace(/['\";&?:#|]/g, ''); // just for safty\n\n        var path = decodeURI(slash(Path.normalize(pathname)));  // windows compat.....\n        var fileversion = req.headers['fileversion']; // \n\n        var m = path.match(/^\\/([^/]*)\\/(.*)/)\n\n\n\n        if (m) {\n          var repositorypath = Path.join(sourceDir, m[1]);\n          var filepath = m[2]\n        } else {\n          repositorypath = sourceDir\n          filepath = path\n        }\n\n\n        // log(\"authorize-requests: \" + this.options[\"authorize-requests\"])\n        if (this.options[\"authorize-requests\"]) {\n          // log(\"AUTH REQUIRED\")\n\n          var org = this.options[\"github-organization\"]\n          if (!org) { \n            logRequest(req,\"CONFIG ERROR: github-organization is missing\")\n          }\n          var teamName = this.options[\"github-team\"]\n          if (!teamName) { \n            logRequest(req, \"CONFIG ERROR: github-team is missing\")\n          }\n\n          var username = req.headers['gitusername'];\n          var password = req.headers['gitpassword'];\n\n          // log(\"user \" + username)\n          // log(\"password \" + (password + \"\").slice(0,3))\n\n          if (!username || !password) {\n            res.writeHead(403);\n            res.end('Please authenticate yourself\\n');\n            return;\n          }\n\n          // cache the authorization to go light on the github API and answer faster ourselves\n          var authorizationKey = org + \"/\" + org + \"/\" + username + \"/\" + password \n          var lastAuthorization = GithubOriganizationMemberCache[authorizationKey]\n          if (lastAuthorization && lastAuthorization.success) {\n            logRequest(req,\"AUTHORIZED BY CACHE\")\n            // do nothing\n          }  else {\n            logRequest(req,\"AUTHORIZATION required org: \" + org + \" team: \" + teamName)\n            let teamInfo = await fetch(`https://api.github.com/orgs/${org}/teams/${teamName}`, {\n              method: \"GET\",\n              headers: {\n                Authorization: \"token \" + password  \n              }\n            }).then(r => r.json());    \n\n            if (teamInfo.members_url) {\n              var members = await fetch(teamInfo.members_url.replace(/\\{.*/,\"\"), {\n                method: \"GET\",\n                headers: {\n                  Authorization: \"token \" + password  \n                }\n              }).then(r => r.json());\n              var userInTeam = members.map(ea => ea.login).includes(username)\n            } \n\n            if (!userInTeam) {\n              GithubOriganizationMemberCache[authorizationKey] = {\n                success: false,\n                time: Date.now(),\n                previous: lastAuthorization // for preventing... DoS attacks? #TODO\n              }\n              res.writeHead(403);\n              res.end('Authentification/Authorization failed\\n');\n              return;\n            }\n\n            GithubOriganizationMemberCache[authorizationKey] = {\n              success: true,\n              time: Date.now()\n            }\n          }\n        }\n\n        logRequest(req, `${req.method} ${path}  ${fileversion ? '[version= ' + fileversion + ']' : ''}`);\n        // logRequest(req, `repositorypath: ${repositorypath} filepath: ${filepath}`);\n\n        if (breakOutRegex.test(path) === true) {\n          res.writeHead(500);\n          res.end(\n            'Your not allowed to access files outside the pages storage area\\n'\n          );\n          return;\n        }\n\n        if (pathname.match(/\\/_tmp\\//)) {\n          return this.TMP(pathname, req, res);\n        }\n\n        if (pathname.match(/\\/_vq\\//)) {\n          return this.BP2019Proxy(pathname, req, res, proxy);\n        }\n\n        if (pathname.match(/\\/_github\\//)) {\n          req.url = req.url.replace('/_github/', '');\n          return proxy.web(req, res, { target: 'http://172.16.64.132:9001/' });\n        }\n        if (pathname.match(/\\/_meta\\//)) {\n          return this.META(pathname, req, res);\n        }\n        if (pathname.match(/\\/_webhook\\//)) {\n          return this.WEBHOOK(pathname, req, res);\n        }\n        if (path.match(/\\/_git.*/)) {\n          return this.GIT(path, req, res);\n        }\n        if (path.match(/\\/_graphviz.*/)) {\n          return this.GRAPHVIZ(path, req, res); // #TODO auth should be required \n        }\n        if (path.match(/\\/_make.*/)) {\n          return this.MAKE(path, req, res); // #TODO auth should be required\n        }\n        if (pathname.match(/\\/_search\\//)) {\n          return this.SEARCH(pathname, req, res);\n        }\n        if (req.method == 'GET') {\n          await  this.GET(repositorypath, filepath, fileversion, req, res);\n        } else if (req.method == 'PUT') {\n          await this.PUT(repositorypath, filepath, req, res);\n        } else if (req.method == 'DELETE') {\n          await  this.DELETE(repositorypath, filepath, res);\n        } else if (req.method == 'MKCOL') {\n          await this.MKCOL(repositorypath, filepath, res);\n        } else if (req.method == 'OPTIONS') {\n          await this.OPTIONS(repositorypath, filepath, req, res);\n        } else if (req.method == 'MOVE') {\n          await this.MOVE(repositorypath, filepath, req, res);\n        }\n      } catch (e) {\n        console.error('ERROR on request ' + req.url, e);\n        res.writeHead(500);\n        res.end('ERROR: ' + e);\n      }\n    } finally {\n      logRequest(req, \"FINISHED \" + req.method + \" (\"+ Math.round(Date.now() - startRequestTime) + \"ms) \" + req.url + \" \" )\n    }\n  }\n\n  static BP2019Proxy(pathname, req, res, proxy) {\n    \n    req.url = req.url.replace(/\\/_vq\\//, '');\n    return proxy.web(req, res, { target: 'http://localhost:10055/' });\n    \n    // res.writeHead(200);\n    //   res.end('Hey you wanted' + pathname);    \n  }\n\n  \n  static GET(repositorypath, filepath, fileversion, req, res) {\n    if (filepath.match(Lively4bundleName)) {\n      return this.ensureBundleFile(repositorypath, filepath, req, res);\n    } else if (fileversion && fileversion != 'undefined') {\n      return this.readFileVersion(repositorypath, filepath, fileversion, req, res);\n    } else {\n      return this.readFile(repositorypath, filepath, req, res);\n    }\n  }\n  \n  static hashFilepath(filepath) {\n    return filepath.replace(/\\//g,\"_\")\n  }\n  \n  static async ensureBundleFile(repositorypath, bundleFilepath, req, res) {\n    var bundleFile = Path.join(repositorypath, bundleFilepath)\n    if (!await fs_exists(bundleFile)) {\n      logRequest(req,\"CREATE BUNDLE for \" + repositorypath)\n      // #TODO pull file existence logic into javascript?\n      await this.ensureDirectory(repositorypath, Lively4optionsDir)\n      let optionsDir = Path.join(repositorypath, Lively4optionsDir)\n\n      await this.ensureDirectory(repositorypath, Lively4transpileDir)\n      let transpileDir = Path.join(repositorypath, Lively4transpileDir)\n\n      try {\n        var bootlist = await fs_readFile(repositorypath + \"/\" + Lively4bootfilelistName)\n      } catch(e) {\n        logRequest(req,\"WARNING, could not read \" + Lively4bootfilelistName + \":\" + e)\n      }\n      var relativeBootFiles = []\n      var relativeOptionFiles = []\n      var relativeTranspileFiles = []\n\n      if (bootlist) {\n        var hashed = new Map()\n        for(let file of bootlist.split(\"\\n\")) {\n\n          let filehash = this.hashFilepath(file)\n          // logRequest(req, \"filehash \" + filehash)\n          hashed.set(filehash, file)\n\n          let filepath = Path.join(repositorypath, file)\n\n          var stats = await try_fs_stat(filepath)\n          if (!stats) {\n            logRequest(req, \"ignore \" + filepath)\n            continue;\n          }\n          let optionsFile = Path.join(optionsDir, filehash)\n          let transpileFile = Path.join(transpileDir, filehash)\n          let transpileMapFile = Path.join(transpileDir, filehash + \".json.map\")\n\n          relativeBootFiles.push(file)\n\n          var optionsStats = await try_fs_stat(optionsFile)\n          if  (!optionsStats || stats.mtime > optionsStats.mtime ) {\n            var updatedOptions = await this.readOptions(repositorypath, filepath, stats)\n            logRequest(req, \"UPDATE OPTIONS \" + optionsFile)\n            await fs_writeFile(optionsFile, JSON.stringify(updatedOptions, null, 2))\n          }\n          relativeOptionFiles.push(Path.join(Lively4optionsDir, filehash)) \n\n          let transpileStats = await try_fs_stat(transpileFile)\n          if (transpileStats) {\n            if  (stats.mtime > transpileStats.mtime ){\n              logRequest(req, \"DELETE \" + transpileFile)\n              await this.deletePath(transpileFile)\n            } else {\n              relativeTranspileFiles.push(Path.join(Lively4transpileDir, filehash))\n            }          \n          }\n          let transpileMapStats = await try_fs_stat(transpileMapFile)\n          if (transpileMapStats) {\n            if  (stats.mtime > transpileMapStats.mtime ){\n              logRequest(req, \"DELETE \" + transpileMapFile)\n              await this.deletePath(transpileMapFile)\n            } else {\n              relativeTranspileFiles.push(Path.join(Lively4transpileDir, filehash  + \".json.map\"))\n\n            }\n          }\n        }\n\n        // DELETE not unused options/transpiled caches\n        // should not be needed, because.... it will not end up in zip anyway...\n\n        // for (let optionfile of fs.readdirSync(optionsDir)) {\n        //   if (!hashed.get(optionfile)) {\n        //     let filePath =  optionsDir + \"/\" +optionfile\n        //     logRequest(req, \"delete \" + filePath)\n        //     await this.deletePath(filePath)\n        //   } \n        // }\n        // for (let transpiledfile of fs.readdirSync(transpileDir)) {\n        //   let filePath =  transpileDir + \"/\" +transpiledfile\n        //   if (!hashed.get(transpiledfile)) {\n        //     logRequest(req, \"delete \" + transpileDir + \"/\" + transpiledfile)\n        //     await this.deletePath(filePath)\n        //   }\n        //   if (!hashed.get(transpiledfile.replace(/\\.json.map$/,\"\"))) {\n        //     logRequest(req, \"delete \" + transpileDir + \"/\" + transpiledfile)\n        //     await this.deletePath(filePath)\n        //   }\n        // }\n\n      }\n\n      let quoteList = function(list) {\n        return list.map(ea => `\"${ea}\"`).join(\" \")\n      }\n\n      var cmd = `cd ${repositorypath}; \n        if [ ! -e ${Lively4bundleName} ]; then\n          zip -r ${Lively4bundleName} ${quoteList(relativeBootFiles)} ${quoteList(relativeOptionFiles)} ${quoteList(relativeTranspileFiles)};\n        fi`\n      // logRequest(req, \"ZIP \" + cmd)\n      var result = await run(cmd)\n      // logRequest(req, \"stdout: \" + result.stdout + \"\\nstderr: \" + result.stderr)\n    }\n    return this.readFile(repositorypath, bundleFilepath, undefined, res)\n  }\n  \n  \n  \n  static async isInBootfile(repositorypath, filepath) {\n    console.log(\"isInBootfile \" + Lively4bootfilelistName + \" in \"+ repositorypath + \" \" + filepath)\n    if (filepath.match(Lively4bootfilelistName)) {\n      return true // the bootfilelist always invalidates itself...\n    }\n    \n    // costs... 10ms ... so #Refactor before using it every GET requests\n    var result = (await run(`cd ${repositorypath}; \n      echo ${Lively4bootfilelistName}\n      if [ -e ${Lively4bootfilelistName} ]; then\n        grep ${filepath} ${Lively4bootfilelistName}\n      fi`)).stdout      \n    return result.match(filepath)\n  }\n  \n  \n  /* load a specific version of a file through git */\n  static async readFileVersion(repositorypath, filepath, fileversion, req, res) {\n    var {stdout, stderr, error} = await run(\n      'cd ' + repositorypath + ';' + 'git show ' + fileversion + ':' + filepath,\n      res\n    );\n    var headers = {}\n    headers['Content-Type'] =  mime.lookup(filepath);\n    // console.log(\"[readfile version] stderr \" + stderr )\n    // console.log(\"[readfile version] err \", error == null )\n    \n    // ok, this is not easy to figure out\n    \n    // console.log(\"[readfile version] version \", fileversion )\n    \n    headers['fileversion'] =  fileversion;\n    \n    // not supported by git...\n    // headers['modified'] =   await this.getLastModified(repositorypath, filepath);\n\n    if (error == null) {\n      res.writeHead(200, headers);\n      res.end(stdout);\n    } else {\n      // console.log(\"ERROR ERROR 300\")\n      res.writeHead(300, headers);\n      res.end(stdout + stderr);\n    }\n  }\n  \n  \n  static async invalidateBundleFile(repositorypath, filepath) {\n    if (filepath.match(Lively4transpileDir) // all compiled files are bundled?\n        || await this.isInBootfile(repositorypath, filepath)) {\n      log(\"INVALIDATE \" + Lively4bundleName + \" in \"+ repositorypath)\n      // remove bundle if we uploaded a file that belongs into it\n      await this.deleteBundleFile(repositorypath)\n    } else {\n      log(\"NOTINBOOTFILE \" +  repositorypath + \" \" + filepath)\n    }\n  }\n\n  static async deleteBundleFile(repositorypath) {\n    return await run(`cd ${repositorypath}; \n      if [ -e ${Lively4bundleName} ]; then\n        rm ${Lively4bundleName}\n      fi`)\n  }  \n  \n  static async ensureDirectory(path, name) {\n    // #TODO do it directly in JavaScript instead of Polyglot?\n    var result = await run(`cd ${path}; \n      if [ ! -e ${name} ]; then\n        mkdir ${name}\n      fi`)\n    if (result.stderr) {\n      log(\"ensureDirectory stderr:\" + result.stderr)\n    }\n  }\n  \n  static async ensureSpecialParentDirectories(repositorypath, filepath, req) {\n    if (filepath.match(Lively4transpileDir)) { \n      await this.ensureDirectory(repositorypath, Lively4transpileDir)\n    }\n    \n    // if (filepath.match(Lively4optionsDir)) { \n    //   await this.ensureDirectory(repositorypath, Lively4optionsDir)\n    // }\n  }\n\n  static async invalidateOptionsFile(repositorypath, filepath, req) {\n    if (filepath.match(Lively4optionsDir)) return  // don't do it on yourself\n    if (!filepath.match(/\\.js/)) return  // only javascript files are transpiled...\n    \n    logRequest(req, \"invalidate options files\" + Lively4bundleName + \" in \"+ repositorypath)\n    var hashedpath = filepath.replace(/\\//g,\"_\")\n    await run(`cd ${repositorypath}; \n        if [[ -e ${Lively4optionsDir}/${hashedpath} ]]; then\n          rm ${Lively4optionsDir}/${hashedpath}\n        fi`)\n  }\n  \n  static async invalidateTranspiledFile(repositorypath, filepath, req) {\n    if (filepath.match(Lively4transpileDir)) return  // don't do it on yourself\n    if (!filepath.match(/\\.js/)) return  // only javascript files are transpiled...\n    \n    logRequest(req,\"invalidate transpilation files\" + Lively4bundleName + \" in \"+ repositorypath)\n    var hashedpath = filepath.replace(/\\//g,\"_\")\n    var result = await run(`cd ${repositorypath}; \n        if [ -e ${Lively4transpileDir} ]; then\n          rm ${Lively4transpileDir}/${hashedpath}\n          rm ${Lively4transpileDir}/${hashedpath}.map.json\n        fi`) \n    logRequest(req, \"RESULT \" + result.stdout)\n  }\n  \n  static async readFile(repositorypath, filepath, req, res) {\n    // logRequest(req, 'read based in:' + repositorypath + \" file: \" +filepath);\n    var fullpath = Path.join(repositorypath, filepath);\n    // throw new Error(\"hello error handler?\")\n\n    try {\n      // var stats = fs.statSync(filepath)\n      var stats = await fs_stat(fullpath);\n    } catch(e){\n      // nothing\n    }\n    \n    if (!stats) {\n      console.log('FILE DOES NOT EXIST ' + fullpath)\n      res.writeHead(404);\n      return res.end('File not found!\\n');\n    }\n    if (stats.isDirectory()) {\n      this.readDirectory(fullpath, req, res, 'text/html');\n    } else {\n      res.writeHead(200, {\n        'content-type': mime.lookup(fullpath),\n        fileversion: await this.getVersion(repositorypath, filepath),\n        modified: await this.getLastModified(repositorypath, filepath)\n      });\n      var stream = fs.createReadStream(fullpath, {\n        bufferSize: 64 * 1024\n      });\n      stream.on('error', function(err) {\n        log('error reading: ' + fullpath + ' error: ' + err);\n        res.end('Error reading file\\n');\n      });\n      stream.pipe(res);\n    }\n  }\n\n  static readDirectory(aPath, req, res, contentType) {\n    fs.readdir(aPath, function(err, files) {\n      var dir = {\n        type: 'directory',\n        contents: []\n      };\n\n      var checkEnd = () => {\n        // is there a better way for synchronization???\n        if (dir.contents.length === files.length) {\n          var data;\n          if (contentType == 'text/html') {\n            // prefix the directory itself as needed if it does not end in \"/\"\n            var match = req.url.match(/\\/([^/]+)$/); // aPath stripped the / already\n            var prefix = match ? match[1] + '/' : '';\n\n            \n            data =\n`<html><style>\n  body { \n    font-family: arial;\n  }\n </style><body><h1>` +\n              req.url +\n              '</h1>\\n<ul>' +\n              // '<!-- prefix=' +\n              // `PATH: ${aPath} PREFIX: ${prefix} URL: ${req.url} URL2: ${JSON.stringify(req.headers)}}` +\n              // ' -->' +\n              \n                \n              dir.contents.sort()\n                .map(ea => ea.name)\n                .sort()\n                .map(function(ea) {\n                  return (\n                    \"<li><a href='\" +\n                    prefix +\n                    ea +\n                    \"'>\" +\n                    ea +\n                    '</a></li>'\n                  );\n                })\n                .join('\\n') +\n              '</ul></body></html>';\n            \n            // github return text/plain, therefore we need to do the same\n            res.writeHead(200, {\n              'content-type': 'text/html'\n            });\n            res.end(data);\n          } else {\n            data = JSON.stringify(dir, null, 2);\n            // github return text/plain, therefore we need to do the same\n            res.writeHead(200, {\n              'content-type': 'text/plain'\n            });\n            res.end(data);\n          }\n        }\n      };\n      checkEnd();\n      files.forEach(function(filename) {\n        var filePath = Path.join(aPath, filename);\n        fs.stat(filePath, function(err, statObj) {\n          if (!statObj) {\n            dir.contents.push({\n              type: 'file',\n              name: filename,\n              size: 0\n            });\n          } else if (statObj.isDirectory()) {\n            dir.contents.push({\n              type: 'directory',\n              name: filename,\n              size: 0\n            });\n          } else {\n            dir.contents.push({\n              type: 'file',\n              name: filename,\n              size: statObj.size\n            });\n          }\n          checkEnd();\n        });\n      });\n    });\n  }\n\n  /*\n   * write file to disk\n   */\n  static async PUT(repositorypath, filepath, req, res) {\n    \n    var fullpath = Path.join(repositorypath, filepath);\n    var fullBody = '';\n    // if (filepath.match(/png$/)) {\n    if (filepath.match(isTextRegEx)) {\n      // #TODO how do we better decide if we need this...\n    } else {\n      logRequest(req, 'set binary encoding');\n      req.setEncoding('binary');\n    }\n    // }\n\n    //read chunks of data and store it in buffer\n    req.on('data', function(chunk) {\n      fullBody += chunk.toString();\n    });\n\n    await new Promise(resolve => req.on('end', resolve))\n    \n    //after transmission, write file to disk\n    \n    // only block at the end...\n    await this.invalidateOptionsFile(repositorypath, filepath, req)\n    await this.invalidateTranspiledFile(repositorypath, filepath, req,)\n    await this.invalidateBundleFile(repositorypath, filepath, req)\n    await this.ensureSpecialParentDirectories(repositorypath, filepath, req)\n\n    if (fullpath.match(/\\/$/)) {\n      return mkdirp(fullpath, err => {\n        if (err) {\n          logRequest(req, 'Error creating dir: ' + err);\n        }\n        logRequest(req, 'mkdir ' + fullpath);\n        res.writeHead(200, 'OK');\n        res.end();\n      });\n    } \n    var lastVersion = req.headers['lastversion'];\n    var currentVersion = await this.getVersion(repositorypath, filepath);\n\n    // logRequest(req, 'last version: ' + lastVersion);\n    // logRequest(req, 'current version: ' + currentVersion);\n\n    // we have version information and there is a conflict\n    if (lastVersion && currentVersion && lastVersion !== currentVersion) {\n      logRequest(req, '[writeFile] CONFLICT DETECTED');\n      res.writeHead(409, {\n        // HTTP CONFLICT\n        'content-type': 'text/plain',\n        conflictversion: currentVersion\n      });\n      res.end('Writing conflict detected: ' + currentVersion);\n      return;\n    }\n\n    // ogRequest(req, 'size ' + fullBody.length);\n    let result = await fs_writeFile(fullpath, fullBody, fullpath.match(isTextRegEx) ? undefined : 'binary')\n    if (result.err) {\n      // throw err;\n      logRequest(req, result.err);\n      throw new Error(\"Error in writeFile \" + fullpath, result.err)\n    }\n\n    if (!autoCommit || req.headers['nocommit'])  {\n      // logRequest(req, 'saved ' + fullpath);\n      res.writeHead(200, 'OK');\n      res.end();\n      return\n    } \n\n    var username = req.headers.gitusername;\n    var email = req.headers.gitemail;\n    // var password = req.headers.gitpassword; // not used yet\n\n    var authCmd = '';\n    if (username) authCmd += `git config user.name '${username}'; `;\n    if (email) authCmd += `git config user.email '${email}'; `;\n    // logRequest(req, 'EMAIL ' + email + ' USER ' + username);\n\n    // #TODO maybe we should ask for github credetials here too?\n    let cmd = `\n      cd \"${repositorypath}\"; \n      if [ -e .git ]; then\n        ${authCmd} git add \"${filepath}\"; \n        git commit -m \"AUTO-COMMIT ${filepath}\"\n      else\n        echo \"no git repository\" \n      fi\n    `;\n    {\n      let {error, stdout, stderr} = await run(cmd)\n      // logRequest(req, 'git stdout: ' + stdout);\n      // logRequest(req, 'git stderr: ' + stderr);\n      if (error) {\n        // file did not change....\n        if (!stdout.match(\"no changes added to commit\")) {\n          logRequest(req, 'ERROR');\n          res.writeHead(500, 'Error:' + stderr);\n          return res.end('ERROR stdout: ' + stdout + \"\\nstderr:\" + stderr);\n        }\n      } \n    }\n    var {options, body, error} = await this.ensureCachedOptions(repositorypath, filepath)\n    if (!options) {\n        res.writeHead(500);\n        res.end('could not retrieve new version... somthing went wrong: ' + error);\n    } else {\n      res.writeHead(200, {\n        'content-type': 'text/plain',\n        fileversion: options.version,\n      });\n      res.end(body);\n    }\n  }  \n  \n  static async ensureCachedOptions(repositorypath, filepath) {\n    console.log(\"ensureCachedOptions \" + repositorypath + \", \" + filepath )\n    let options = await this.readOptions(repositorypath, filepath)\n    if (options.error) {\n      return {options: null, body: null, error: options.error}\n    } else {\n      console.log(\"options: \" +  options )\n      var optionsBody = JSON.stringify(options, null, 2)\n      let optionsPath = this.optionsPath(repositorypath, filepath)\n      return {options, body: optionsBody, written: fs_writeFile(optionsPath, optionsBody)}\n    }\n  }\n\n  static optionsPath(repositorypath, filepath) {\n    return repositorypath + \"/\" + Lively4optionsDir + \"/\" + filepath.replace(/\\//g,\"_\") \n  }\n  \n  static transpilePath(repositorypath, filepath) {\n    return repositorypath + \"/\" + Lively4transpileDir + \"/\" + filepath.replace(/\\//g,\"_\") \n  }\n  \n  static async deletePath(fullpath) {\n    return run(\n      `f=\"${fullpath}\";\n      if [ -d \"$f\" ]; then rmdir -v \"$f\"; else rm -v \"$f\"; fi`)\n  }\n\n  /*\n   * delete file\n   */\n  static async DELETE(repositorypath, filepath, res) {\n    let fullpath = Path.join(repositorypath, filepath) \n\n    // clear all caches associated with the file\n    await this.deletePath(this.optionsPath(repositorypath, filepath))\n    await this.deletePath(this.transpilePath(repositorypath, filepath)) \n    \n    var result = await this.deletePath(fullpath)\n    if (result.error) {\n      res.writeHead(404)\n      return res.end(\"Error \" + result.stdout + \"\\n\" + result.stderr)\n    }    \n    res.writeHead(200)\n    res.end(\"deleted \" + fullpath)\n  }\n  \n   /*\n   * move file or directory\n   */\n  \n  static async moveResource(source, destination) {\n    return run(\n      `SOURCE=\"${source}\";\n       DESTINATION=\"${destination}\";\n       if [ -e $SOURCE -a -e $DESTINATION ]; \n          then mv $SOURCE $DESTINATION;\n       fi`)\n  }\n  \n  static async MOVE(repositorypath, filepath, req, res) {\n    \n    var source = req.url\n    \n    var destination = req.headers['destination']\n    \n    var re = new RegExp(Server.options.myurl + \"(.*)\")    \n    var m = destination.match(re)\n    \n    if (m) {\n      destination = m[1]\n    } else {\n      res.writeHead(404);\n      return res.end(\"Server for destination and source don't match!\")\n    }\n    \n    source = Server.options.directory + source.substr(1)\n    destination = Server.options.directory + destination\n    \n    var result = await this.moveResource(source, destination)\n    logRequest(req, 'MOVE from ' + source + ' to ' + destination)\n    \n    if (result.error) {\n      res.writeHead(404)\n      return res.end(\"Error \" + result.stdout + \"\\n\" + result.stderr)\n    }    \n    res.writeHead(200)\n    res.end(\"moved \" + source + \" to \" + destination)\n\n  }\n  \n  \n  /*\n   * create directory\n   */\n  static async MKCOL(repositorypath, filepath, res) {\n    let fullpath = Path.join(repositorypath, filepath) \n    // #TODO check for existing directory and return 409 ?\n    var result = await run(`mkdir -v \"${fullpath}\"`);\n    if (result.error) {\n      res.writeHead(404);\n      return res.end(\"Error \" + result.stdout + \"\\n\" + result.stderr);  \n    }\n    res.writeHead(200);\n    res.end(\"created directory: \" + fullpath);\n  }\n\n  static async readOptions(repositorypath, filepath, stats) {\n    var fullpath = Path.join(repositorypath, filepath)\n    if (!stats) {\n      try {\n        stats = await fs_stat(fullpath);\n      } catch(e) {\n        console.error(\"STATS error \" + filepath, e)\n        return JSON.stringify({error: e}, null, 2)\n      }\n    } \n    var result = { type: 'file' }\n    result.name = filepath\n    result.size = stats.size\n    result.version = await this.getVersion(repositorypath, filepath)  // PERFORMANCE WARNING\n    result.modified = await this.getLastModified(repositorypath, filepath) // PERFORMANCE WARNING\n    return result\n  }\n  \n  \n  /*\n   * list directory contents and file meta information\n   */\n  static async OPTIONS(repositorypath, filepath, req, res) {\n    var fullpath = Path.join(repositorypath, filepath)\n    logRequest(req, 'OPTIONS ' + fullpath)\n    var after = req.headers['gitafter']\n    var until = req.headers['gituntil']\n        \n    try {\n      var stats = await fs_stat(fullpath);\n    } catch(err) {\n      logRequest(req, 'stat ERROR: ' + err)\n      if (err.code == 'ENOENT') {\n        res.writeHead(200)\n        let data = JSON.stringify({error: err}, null, 2)\n        res.end(data)\n      } else {\n        logRequest(req, err)\n      }\n      return \n    }\n    if (stats.isDirectory()) {\n      if (req.headers['showversions'] == 'true') {\n        return this.listVersions(repositorypath, filepath, res, after, until);\n      }\n\n      if (req.headers['filelist'] == 'true') {\n        this.readFilelist(repositorypath, filepath, res);\n      } else {\n        this.readDirectory(fullpath, req, res);\n      }\n    } else if (stats.isFile()) {\n      if (req.headers['showversions'] == 'true') {\n        return this.listVersions(repositorypath, filepath, res, after, until);\n      }\n      let data = await this.readOptions(repositorypath, filepath, stats)\n      res.writeHead(200, {\n        'content-type': 'text/plain' // github return text/plain, therefore we need to do the same\n      });\n      res.end(JSON.stringify(data, null, 2))\n    }\n  }\n\n  /*\n   * recursively list directories and with modification date of files\n   * #Idea (should be used to update caches)\n   */\n  static async readFilelist(repositorypath, filepath, res) {\n    var result = await run(\n      `cd \"${repositorypath}/${filepath}\"; find -not -path '*/.git/*' -printf \"%TY-%Tm-%Td %TH:%TM:%.2TS\\t%y\\t%s\\t%p\\n\"`\n    );\n    var list = result.stdout\n      .split('\\n')\n      .map(line => {\n        var row = line.split('\\t');\n        return {\n          modified: row[0],\n          type: row[1] == 'd' ? 'directory' : 'file',\n          size: row[2],\n          name: row[3]\n        };\n      })\n      .filter(ea => ea.name && ea.name !== '.');\n    if (result.error) {\n      console.error(\"readFilelist stderr \" + result.stderr)\n      console.error(\"readFilelist: \" + result.error)\n    }\n    // console.log(\"readFilelist found \" + list.length + \" files\")\n    res.writeHead(200, {\n      'content-type': 'json'\n    });\n    res.end(\n      JSON.stringify({\n        type: 'filelist',\n        contents: list\n      })\n    );\n  }\n\n  static listVersions(repositorypath, filepath, res, after, until) {\n    // #TODO rewrite artificial json formatting and for example get rit of trailing \"null\"\n    var format =\n      '\\\\{\\\\\"version\\\\\":\\\\\"%h\\\\\",\\\\\"date\\\\\":\\\\\"%ad\\\\\",\\\\\"author\\\\\":\\\\\"%an\\\\\"\\\\,\\\\\"parents\\\\\":\\\\\"%p\\\\\",\\\\\"comment\\\\\":\\\\\"%f\\\\\"},';\n    \n    // #TODO #Security #Parameters?\n    var range = `${after ? '--after=\"' +after +'\"': \"\" } ${until ? '--until=\"' + until +'\"' : \"\"}`\n    \n    respondWithCMD(\n      `cd ${repositorypath};\n      echo \"{ \\\\\"versions\\\\\": [\";\n      git log --pretty=format:${format} ${range} ${filepath};\n      echo null\\\\]}`,\n      res\n    );\n  }\n\n  static META(pathname, req, res) {\n    if (pathname.match(/_meta\\/exit/)) {\n      res.end('goodbye, we hope for the best!');\n      process.exit();\n    } else {\n      res.writeHead(500);\n      res.end('meta: ' + pathname + ' not implemented!');\n    }\n  }\n\n  static async getVersion(repositorypath, filepath) {\n    return (await run(\n      `cd \"${repositorypath}\"; git log -n 1 --pretty=format:%H -- \"${filepath}\"`\n    )).stdout;\n  }\n\n  static async getLastModified(repositorypath, filepath) {\n    return (await run(\n      `cd \"${repositorypath}\"; find \"${filepath}\" -not -path '*/.git/*' -printf \"%TY-%Tm-%Td %TH:%TM:%.2TS\"`\n    )).stdout;\n  }\n\n  static async GIT(sPath, req, res, cb) {\n    logRequest(req, 'git control: ' + sPath);\n\n    var dryrun = req.headers['dryrun'];\n    dryrun = dryrun && dryrun == 'true';\n    // #TODO replace it with something more secure... #Security #Prototype\n    // Set CORS headers\n    var repository = req.headers['gitrepository'];\n    var repositoryurl = req.headers['gitrepositoryurl'];\n    var username = req.headers['gitusername'];\n    var password = req.headers['gitpassword'];\n    var email = req.headers['gitemail'];\n    var branch = req.headers['gitrepositorybranch'];\n    var msg = req.headers['gitcommitmessage'] && cleanString(req.headers['gitcommitmessage']);\n    var filepath = req.headers['gitfilepath'];\n    var gitcommit = req.headers['gitcommit'];\n    var usecolor = req.headers['gitusecolor'];\n\n    var versionA = req.headers['gitversiona'];\n    var versionB = req.headers['gitversionb'];\n    \n    var repositorypath = Path.join(sourceDir, repository)\n    \n    if (!email) {\n      return res.end('please provide email!');\n    }\n    if (!username) {\n      return res.end('please provide username');\n    }\n    if (!password) {\n      return res.end('please login');\n    }\n\n    if (!repository) {\n      return res.end('please specify repository');\n    }\n\n    repository = repository.replace(/^\\//,\"\") // #TODO should we take care of this in the client?\n    \n    var cmd;\n    if (sPath.match(/\\/_git\\/sync/)) {\n      logRequest(req, 'SYNC REPO ' + RepositoryInSync[repository]);\n      if (RepositoryInSync[repository]) {\n        return respondWithCMD(\n          'echo Sync in progress: ' + repository,\n          res,\n          dryrun\n        );\n      }\n      RepositoryInSync[repository] = true;\n      cmd = `${server}/bin/lively4sync.sh '${lively4DirUnix +\n        '/' +\n        repository}' '${username}' '${password}' '${email}' '${branch}' '${msg}'`;\n      await respondWithCMD(cmd, res, dryrun);\n      RepositoryInSync[repository] = undefined;\n      logRequest(req, \"delete bundle: \" + repositorypath)\n      await this.deleteBundleFile(repositorypath)\n    } else if (sPath.match(/\\/_git\\/resolve/)) {\n      cmd =\n        `${server}/bin/lively4resolve.sh '` +\n        lively4DirUnix +\n        '/' +\n        repository +\n        \"'\";\n      respondWithCMD(cmd, res, dryrun);\n    } else if (sPath.match(/\\/_git\\/status/)) {\n      cmd = `cd ${lively4DirUnix}/${repository};\n        git -c color.status=always  status ; git log --color=always HEAD...origin/${branch} --pretty=\"format:%h\\t%aN\\t%cD\\t%f\"`;\n      respondWithCMD(cmd, res, dryrun);\n    } else if (sPath.match(/\\/_git\\/log/)) {\n      cmd =\n        'cd ' + lively4DirUnix + '/' + repository + '; git log --color=always';\n      respondWithCMD(cmd, res, dryrun);\n    } else if (sPath.match(/\\/_git\\/graph/)) {\n      cmd =\n        'cd ' +\n        lively4DirUnix +\n        '/' +\n        repository +\n        '; git log --graph -100 --color=always';\n      respondWithCMD(cmd, res, dryrun);\n    } else if (sPath.match(/\\/_git\\/commit/)) {\n      if (!msg) {\n        return res.end('Please provide a commit message!');\n      }\n      cmd =\n        \"cd '\" +\n        lively4DirUnix +\n        '/' +\n        repository +\n        \"';\\n\" +\n        'git config user.name ' +\n        username +\n        ';\\n' +\n        'git config user.email ' +\n        email +\n        ';\\n' +\n        // \"git commit \"+ msg +\" -a \";\n        `if [ -e \".git/MERGE_HEAD\" ];\n        then\n          echo \"merge in progress - you had conflicts or a manual merge is in progress\";\n        else\n          git commit -m'${msg}' -a ;\n        fi`;\n\n      respondWithCMD(cmd, res, dryrun);\n    } else if (sPath.match(/\\/_git\\/diff/)) {\n      var commit = 'origin/' + branch;\n      if (gitcommit) {\n        commit = gitcommit + '~1 ' + gitcommit;\n      }\n      cmd = `cd ${lively4DirUnix}/${repository}; git diff --color=always ${commit}`;\n      respondWithCMD(cmd, res, dryrun);\n    } else if (sPath.match(/\\/_git\\/clone/)) {\n      let url = repositoryurl.replace(\"https://\", `https://${username}:${password}@`)\n      cmd =\n        `cd ${lively4DirUnix}; \\n` +\n        'git clone --recursive ' +\n        url +\n        ' ' +\n        repository +`;\\n` + // this will leave the password in the config\n        `cd ${lively4DirUnix}/${repository}; \\n` + \n        // #TODO can we avoid the and prevent the storing of username and password in the first place, e.g. is there is method of handing git the usename and password without encoding them in the url?\n        // remove the username password from the config       \n        `git remote set-url origin ${repositoryurl}` \n\n      respondWithCMD(cmd, res, dryrun);\n    } else if (sPath.match(/\\/_git\\/checkout/)) {\n      \n      logRequest(req,'CHECKOUT REPO ' + RepositoryInSync[repository] + \" \" + filepath);\n      \n      // #TODO we should merge this semaphore logic...\n      if (RepositoryInSync[repository]) {\n        return respondWithCMD(\n          'echo Sync in progress: ' + repository,\n          res,\n          dryrun\n        );\n      }\n      RepositoryInSync[repository] = true;\n      // checkout single file directly from origin server... without pulling in other changes\n      // WARNING: the changes will appear as local changes but should be resolved by the merge later\n      // from git's standpoint it will appeach as two changes with the same content\n      let url = repositoryurl.replace(\"https://\", `https://${username}:${password}@`)\n      cmd = `cd ${lively4DirUnix}/${repository};\\n` + \n        `git remote set-url origin ${url};\\n` +\n        `git fetch; \\n` +\n        `git checkout origin/${branch} -- ${filepath}; \\n`+\n        `git remote set-url origin ${repositoryurl}` \n\n      await respondWithCMD(cmd, res, dryrun);\n      RepositoryInSync[repository] = undefined;\n    } else if (sPath.match(/\\/_git\\/npminstall/)) {\n      cmd = `cd ${lively4DirUnix}/${repository};\\n` + 'npm install';\n      respondWithCMD(cmd, res, dryrun);\n    } else if (sPath.match(/\\/_git\\/npmtest/)) {\n      cmd = `cd ${lively4DirUnix}/${repository};\\n` + 'npm test';\n      respondWithCMD(cmd, res, dryrun);\n    } else if (sPath.match(/\\/_git\\/remoteurl/)) {\n      cmd =\n        `cd ${lively4DirUnix}/${repository};\\n` +\n        'git config --get remote.origin.url';\n      respondWithCMD(cmd, res, dryrun);\n    } else if (sPath.match(/\\/_git\\/branches$/)) {\n      cmd = `cd ${lively4DirUnix}/${repository};\\n` + 'git branch -a ';\n      respondWithCMD(cmd, res, dryrun);\n    } else if (sPath.match(/\\/_git\\/branch$/)) {\n      cmd =\n        `${server}/bin/lively4branch.sh '${repository}' ` +\n        `'${username}' '${password}' '${email}' '${branch}'`;\n      respondWithCMD(cmd, res, dryrun);\n    } else if (sPath.match(/\\/_git\\/merge$/)) {\n      cmd =\n        `${server}/bin/lively4merge.sh '${lively4DirUnix}/${repository}' ` +\n        `'${username}' '${password}' '${email}' '${branch}'`;\n      respondWithCMD(cmd, res, dryrun);\n    } else if (sPath.match(/\\/_git\\/squash$/)) {\n      cmd =\n        `${server}/bin/lively4squash.sh '${lively4DirUnix}/${repository}' ` +\n        `'${username}' '${password}' '${email}' '${branch}' '${msg}'`;\n      respondWithCMD(cmd, res, dryrun);\n    } else if (sPath.match(/\\/_git\\/delete$/)) {\n      cmd = `${server}/bin/lively4deleterepository.sh '${lively4DirUnix}/${repository}'`;\n      respondWithCMD(cmd, res, dryrun);\n    } else if (sPath.match(/\\/_git\\/show$/)) {\n      cmd = `cd ${lively4DirUnix}/${repository};\\n` + `git show ${usecolor ? \" --color=always \" : \"\"}`  + gitcommit;\n      respondWithCMD(cmd, res, dryrun);\n    } else if (sPath.match(/\\/_git\\/reset$/)) {\n      cmd = `cd ${lively4DirUnix}/${repository};\\n` + `git reset --hard origin/${branch}`;\n      respondWithCMD(cmd, res, dryrun);\n    } else if (sPath.match(/\\/_git\\/mergebase$/)) {\n      cmd = `cd ${lively4DirUnix}/${repository};\\n` + `git merge-base ${versionA} ${versionB} `;\n      respondWithCMD(cmd, res, dryrun);\n    } else if (sPath.match(/\\/_git\\/reset-hard/)) {\n      cmd = `cd ${lively4DirUnix}/${repository};\\n` + `git whatchanged`;\n      respondWithCMD(cmd, res, dryrun);\n    } else {\n      res.writeHead(200);\n      res.end('Lively4 git Control! ' + sPath + ' not implemented! :(');\n    }\n  }\n\n  static SEARCH(sPath, req, res) {\n    var pattern = req.headers['searchpattern'];\n    var rootdirs = req.headers['rootdirs'];\n    var excludes = '.git,' + req.headers['excludes'];\n\n    if (sPath.match(/\\/_search\\/files/)) {\n      var cmd = 'cd ' + lively4DirUnix + '; ';\n      cmd += 'find ' + rootdirs.replace(/,/g, ' ') + ' -type f ';\n      cmd += excludes\n        .split(',')\n        .map(function(ea) {\n          return ' -not -wholename \"*' + ea + '*\"';\n        })\n        .join(' ');\n      cmd +=\n        ' | while read file; do grep -H \"' +\n        pattern +\n        '\" \"$file\" ; done | cut -b 1-200';\n      return respondWithCMD(cmd, res);\n    } else {\n      res.writeHead(200);\n      res.end('Lively4 Search! ' + sPath + ' not implemented!');\n    }\n  }\n\n  /*\n   * Experimental in memory tmp file for drag and drop #Hack\n   */\n  static TMP(pathname, req, res) {\n    // log(\"tempFile \" + pathname)\n    var file = pathname.replace(/^\\/_tmp\\//, '');\n    if (req.method == 'GET') {\n      var data = this.tmpStorage[file];\n      res.writeHead(200);\n      res.end(data, 'binary');\n    }\n    if (req.method == 'PUT') {\n      var fullBody = '';\n      req.setEncoding('binary');\n      req.on('data', chunk => {\n        fullBody += chunk.toString();\n      });\n      req.on('end', async () => {\n        this.tmpStorage[file] = fullBody;\n        setTimeout(() => {\n          log('cleanup ' + file);\n          delete this.tmpStorage[file];\n        }, 5 * 60 * 1000); // cleanup after 5min\n        res.writeHead(200); // done\n        res.end();\n      });\n    }\n  }\n  \n  \n  static GRAPHVIZ(pathname, req, res) {\n    if (req.method == 'POST') {\n      var fullBody = '';\n      req.setEncoding('binary');\n      req.on('data', chunk => {\n        fullBody += chunk.toString();\n      });\n      req.on('end', async () => {\n        var tempFile = (await run(\"mktemp --suffix=.dot\")).stdout.replace(/\\n/g,\"\") \n        \n        // log(`got tmp file '${tempFile}'`)\n        await fs_writeFile(tempFile, fullBody)\n        // log(\"wrote tmp file\")\n        \n        var layout = \"dot\"\n        var type = \"svg\"\n        if (req.headers['graphlayout']) {\n          layout = cleanString(req.headers['graphlayout'])\n        }\n\n        \n        var result = (await run(`${layout} -T${type} '${tempFile}'`))\n        // log(`run dot '${ tempFile}'` )\n        \n        // log(\"deleted temp\")\n        await run(`rm '${tempFile}'`)\n        \n        var source = \"\" + result.stdout\n        if (source == \"\") {\n          logRequest(req, \"GraphViz ERR: \" + result.stderr)\n          res.writeHead(400); // done\n          res.end(result.stderr);          \n        } else {\n          res.writeHead(200); // done\n          res.end(source);          \n        } \n      });\n    }\n  }\n  \n  static MAKE(path, req, res) {\n    console.log(\"MAKE \" + path)\n    \n    var params = URL.parse(req.url, true).query\n    \n    // var cmd = 'cd ' + pathname + '; pwd;';\n    // MakeInProgress\n    var dir = path.replace(/.*_make\\//,\"\")\n      var cmd = 'cd ' + lively4DirUnix + '; ';\n    return respondWithCMD(\"cd \"  +lively4DirUnix + dir +\"; make \" + (params.target || \"\"),  res)\n    //return respondWithCMD(cmd, res)\n  }\n  \n  static webhookListeners(key) {\n    if (!this.webhookListeners) {\n      this.webhookListeners = new Map()\n    }\n    var set = this.webhookListeners[key]\n    if (!set) {\n      set = new Set()\n      this.webhookListeners[key] = set\n    }\n    return set\n  }\n  \n  \n  /* \n    Very basic forward of github webhooks to subscriptions...\n    see https://github.com/LivelyKernel/lively4-core/settings/hooks\n  */\n  static async WEBHOOK(pathname, req, res) {\n    log(\"WEBHOOK \" + req.method + \": \" + pathname)\n    \n    if (req.method == 'GET' && pathname.match(\"/_webhook/register\")) {\n      let key =  req.headers['repositoryname']; \n      log(\"webhook register \" + key)\n      \n      this.webhookListeners(key).add({\n        response: res\n      })\n      // do not answer it... do a long poll\n      \n      // res.writeHead(200); // done\n      // res.end();\n\n    } else if((req.method == 'PUT' || req.method == 'POST') && pathname.match(\"/_webhook/signal\")) {\n   \n      log(\"webhook signal \")\n      var body = '';\n      req.on('data', (data) => {\n          body += data;\n      });\n      req.on('end', () => {\n\n        try {\n          var json = JSON.parse(body)\n        } catch(e) {  \n          res.writeHead(400); // done\n          res.end(\"could not parse: \" + body);\n        }\n        if (json) {\n          var key = json.repository.full_name\n          var listeners = this.webhookListeners(key)\n          // log(\"found listeners: \" + listeners.size)\n          Array.from(listeners).forEach(ea => {\n            var response = ea.response\n            if (response) {\n              // log(\"answer \" + response)\n              response.writeHead(200); // answer long poll \n              response.end(JSON.stringify(json));              \n            }\n            listeners.delete(ea)\n          })\n          res.writeHead(200); // done\n          res.end(\"\");  \n        }\n      });      \n    } else {\n      log(\"webhook: \" + pathname)\n      res.writeHead(200); // not \n      res.end();\n    }    \n  }\n  \n  \n}\n\n// #REFACTOR\n// parse command line arguments\nvar args = argv.option(Server.optionsSpec).run();\nServer.options = args.options\nvar port = args.options.port || 8080;\nvar sourceDir = args.options.directory || '../';\nvar indexFiles = args.options['index-files'];\nvar lively4dir = sourceDir;\nvar server = args.options.server || '.';\nvar bashBin = args.options['bash-bin'] || 'bash';\nutils.config.bashBin = bashBin;\nvar lively4DirUnix = args.options['lively4dir-unix'] || lively4dir;\nvar autoCommit = args.options['auto-commit'] || false;\n\n// Does this work?\n// process.on('uncaughtException', function(error) {\n//   console.log(\"uncaughtException: \" + error)\n//   process.exit(1)\n// });\n// process.on('unhandledRejection', function(reason, p){\n//   console.log(\"unhandledRejection: \" + reason)\n// });\n\nServer.setup();\n\nif (!module.parent) {\n  Server.start();\n}\n\nmodule.exports = Server; // { start }\n"]}