UNPKG

@adobe/git-server

Version:

serve a git repository over http(s)

100 lines (79 loc) 3.94 kB
/* * Copyright 2018 Adobe. All rights reserved. * This file is licensed to you under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. You may obtain a copy * of the License at http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS * OF ANY KIND, either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ 'use strict'; const path = require('path'); const express = require('express'); const fse = require('fs-extra'); const morgan = require('morgan'); // const logger = require('./logger'); const subdomainHandler = require('./subdomainHandler'); const rawHandler = require('./rawHandler'); const xferHandler = require('./xferHandler'); const blobHandler = require('./blobHandler'); const commitHandler = require('./commitHandler'); const contentHandler = require('./contentHandler'); const treeHandler = require('./treeHandler'); const htmlHandler = require('./htmlHandler'); const archiveLinkHandler = require('./archiveLinkHandler'); const archiveHandler = require('./archiveHandler'); function getLogDirectory(options) { return path.normalize((options.logs && options.logs.logsDir) || 'logs'); } function getLogFile(options) { return path.join(getLogDirectory(options), 'request.log'); } function getLogStream(options) { return fse.createWriteStream(getLogFile(options), { flags: 'a' }); } function getMorganFormat(options) { return (options.logs && options.logs.reqLogFormat) || 'common'; } function getMorganOptions(options) { return { stream: getLogStream(options) }; } function createApp(options) { const app = express(); app.disable('x-powered-by'); app.set('title', options.appTitle || 'Helix Git Server'); // request logger app.use(morgan(getMorganFormat(options), getMorganOptions(options))); // setup routing // subdomain handler (e.g. http://<subdomain>.localtest.me/foo/bar -> /<subdomain>/foo/bar) app.use(subdomainHandler(options)); // raw content handler app.get('/raw/:owner/:repo/:ref/*', rawHandler(options)); app.get('/:owner/:repo/raw/:ref/*', rawHandler(options)); // git transfer protocol handler (git clone, pull, push) app.use('/:owner/:repo.git*', xferHandler(options)); // github api handlers app.get('/api/repos/:owner/:repo/git/blobs/:file_sha', blobHandler(options)); app.get('/api/repos/:owner/:repo/git/trees/:ref_or_sha', treeHandler(options)); app.get('/api/repos/:owner/:repo/contents*', contentHandler(options)); app.get('/api/repos/:owner/:repo/commits', commitHandler(options)); // github archive handlers // archive link handlers (redirect to /codeload/...) app.get('/api/repos/:owner/:repo/zipball/:ref?', archiveLinkHandler(options, 'zip')); app.get('/api/repos/:owner/:repo/tarball/:ref?', archiveLinkHandler(options, 'tar.gz')); app.get('/:owner/:repo/archive/:ref.zip', archiveLinkHandler(options, 'zip')); app.get('/:owner/:repo/archive/:ref.tar.gz', archiveLinkHandler(options, 'tar.gz')); // archive request handlers app.get('/codeload/:owner/:repo/legacy.zip/:ref', archiveHandler(options, 'zip')); app.get('/codeload/:owner/:repo/zip/:ref', archiveHandler(options, 'zip')); app.get('/codeload/:owner/:repo/legacy.tar.gz/:ref', archiveHandler(options, 'tar.gz')); app.get('/codeload/:owner/:repo/tar.gz/:ref', archiveHandler(options, 'tar.gz')); // github html handlers (github-like web server) app.get('/:owner/:repo/blob/:ref/*', htmlHandler(options, 'blob')); // single file app.get('/:owner/:repo/tree/:ref*', htmlHandler(options, 'tree')); // directory app.get('/:owner/:repo', htmlHandler(options, 'root')); // home/root directory return app; } module.exports = createApp;