1.6.1 • Published 2 years ago

@ethicdevs/fastify-git-server v1.6.1

Weekly downloads
-
License
MIT
Repository
github
Last release
2 years ago

fastify-git-server

NPM MIT License ci-main Average issue resolution time Number of open issues

A Fastify plugin to easily make one/many Git repositories available for clone/fetch/push.

Installation

$ yarn add @ethicdevs/fastify-git-server
# or
$ npm i @ethicdevs/fastify-git-server

Usage

// server.ts
// std
import { resolve } from "node:path";
// 3rd-party
import fastify from "fastify";
// app
import fastifyGitServer, { GitServer } from "@ethicdevs/fastify-git-server";

const HOST = process.env.HOST || "localhost";
const PORT = process.env.PORT != null ? parseInt(process.env.PORT, 10) : 4200;

async function main() {
  const server = fastify();

  server.register(fastifyGitServer, {
    // can be set to a path to git, else will directly call "git" from $PATH.
    gitExecutablePath: undefined,
    // if true, allows you to send message when client fetch/push to the git server.
    withSideBandMessages: true,
    // a custom resolver to resolve authorisation.
    async authorizationResolver(repoSlug, credentials) {
      if (repoSlug.toLowerCase() === "testorg/test-repo") {
        return (
          credentials.username === "test" && credentials.password === "test"
        );
      }
      return false;
    },
    // a custom resolver to resolve the repository metas.
    async repositoryResolver(repoSlug) {
      if (repoSlug !== "testorg/test-repo") {
        throw new Error("Cannot find such repository.");
      }
      return {
        authMode: GitServer.AuthMode.ALWAYS, // or PUSH_ONLY, or NEVER.
        gitRepositoryDir: resolve(
          "/home/git-server-user/repos/testorg/test-repo",
        ),
      };
    },
    onPush: (push) => {
      push.write("\n");
      push.write("Hey from the server 🖖\n\n");
      // to cancel transmission:
      // push.end("transmission complete 😎\n");
    },
  });

  server.listen(PORT, HOST, (err, listeningOnUrl) => {
    if (err != null) {
      console.error(`❌ Could not start server. Error: ${err.message}`);
    } else {
      console.log(`🚀 Server is up and running at: ${listeningOnUrl}`);
    }
  });

  return server;
}

main();

Run the server like so (or build/bundle it first), and enjoy!

$ ts-node server.ts
# Server is up and running at http://localhost:4200

Now you can easily git clone/fetch/push to the repository assuming you pass the right credentials set for the right repository.

$ git clone http://localhost:4200/testorg/test-repo.git
$ cd test-repo/
$ git fetch
$ git pull --rebase
$ echo "Today is: $(date)" >> ReadMe.md
$ git commit -am 'docs(readme): add the date of today'
$ git push

Contributing

Contributions to this repository are welcome to everyone, please feel free to send a pull request for further review/discussion/merging/resolution. 👌

Run the tests

$ yarn test # run all tests
$ yarn test --coverage # get coverage in ./coverage/lcov-report/index.html
$ yarn test --coverage --watchAll # (dev) quick test iteration loop

Build the lib

$ yarn build
$ yarn typecheck # same but does not write to ./dist folder (only check types)

Credits

This library is a port of git-express, aimed at Fastify v3.x+. Original lib' has not received any update for more than 2 years now and has been released without any license...

It was a great source of inspiration for this library to be born, so thanks to the author for that piece of code! 😅

License

The MIT license.

1.6.1

2 years ago

1.6.0

2 years ago

1.5.0

2 years ago

1.4.3

2 years ago

1.4.2

2 years ago

1.4.1

2 years ago

1.4.0

2 years ago

1.3.1

2 years ago

1.3.0

2 years ago

1.2.0

2 years ago

1.1.0

2 years ago

1.0.0

2 years ago

0.1.0

2 years ago