gitfoss | 376abdda888a4480b2bcf430d119b19639a7eea5 | app/services/gitServer/onPushEvent.ts ∙ GitFOSS
376abdd (parent df4e025)5/15/2026, 6:52:24 PM
.ts
TypeScript
(application/typescript)
// 1st-party
import type { ServiceMethodFactory } from "@ethicdevs/react-monolith";
import { GitServer } from "@ethicdevs/fastify-git-server";
// app
import { Const } from "../../const";
import { Env } from "../../env";
import { GitServerServiceDeps } from "./types";
import { getEnv } from "../../utils/server";

const toAscii = (str: string) => {
  // replace emoji with nothing
  return (
    str
      // .replace(/[\u{1F600}-\u{1F64F}]/gu, "")
      .replace(
        /[\p{Emoji_Presentation}\p{Extended_Pictographic}\p{Emoji}\uFE0F]/gu,
        "",
      )
  );
};

const makeOnPushEvent: ServiceMethodFactory<
  GitServerServiceDeps,
  [GitServer.Event],
  void
> = ({ request }) => {
  const env = getEnv();
  return ({ type, data, message }) => {
    if (data.packType === GitServer.PackType.RECEIVE) {
      // client has done something like "git push" it is uploading
      // server is receiving
      console.log("receive-pack");
      message.write("\n");

      console.log("git.onPushEvent:", type, data, message);
      console.log("git.onPushEvent: data.payload.metas:", data.payload?.metas);

      // git push:
      // on data.requestType === 'git-receive-pack'
      //  + data.packType === 'receive-pack'
      // - data.payload.commitId  # id of incoming commit
      // - data.payload.refType   # "head" or "tag"
      // - data.payload.refName   # the branch or tag name
      // - data.repoDiskPath      # the path to the repository on disk
      // - data.request.id        # the request id

      // git push --tags:
      // on data.requestType === 'git-receive-pack'
      //  + data.packType === 'receive-pack'
      // - data.payload = null
      // - data.repoDiskPath      # the path to the repository on disk
      // - data.request.id        # the request id

      const [orgSlug, repoSlug] = data.repoSlug.split("/");
      request.prisma.repository
        .findFirst({
          where: {
            slug: repoSlug,
            organization: {
              slug: orgSlug,
            },
          },
        })
        .then(async (repo) => {
          if (repo == null) return Promise.resolve(null);
          const updatedRepo = await request.prisma.repository.update({
            where: {
              id: repo.id,
            },
            data: {
              lastPushedAt: new Date(Date.now()),
            },
          });
          return updatedRepo;
        });

      const repoUrlPrefix = `${Env.DEPLOYMENT_SCHEME}://${Env.DEPLOYMENT_DOMAIN}${Env.DEPLOYMENT_SCHEME !== "https" ? `:${Env.PORT}` : ""}`;
      const repoUrlSuffix = `${orgSlug}/${repoSlug}`;
      const repoUrlBase =
        env === "production"
          ? `${repoUrlPrefix}/${repoUrlSuffix}`
          : `${repoUrlPrefix}:${Env.PORT}/${repoUrlSuffix}`;

      // Finally, accept the payload from client
      message.accept();

      // test2

      if (data.payload != null) {
        message.write(toAscii(`Hey ${data.username}, welcome back 🖖.\n\n`));
        message.write(toAscii(`📖 See the details of your push at:\n`));
        if (data.payload.refType === "head") {
          message.write(
            toAscii(`🔗 ${repoUrlBase}/show/${data.payload.commitId}\n`),
          );
          if (data.payload.refName !== Const.PRIMARY_BRANCH_REF) {
            message.write(`\n`);
            // todo: if pr already exist, link to it instead of new pr page
            message.write(
              toAscii(
                `🚀 Quickly create a pull-request from this branch at:\n`,
              ),
            );
            message.write(
              toAscii(
                `🔗 ${repoUrlBase}/pulls/new?from_branch=${encodeURIComponent(
                  data.payload.refName,
                )}\n`,
              ),
            );
          }
        } else if (data.payload.refType === "tag") {
          message.write(
            toAscii(
              `🏷 ${repoUrlBase}/tags/${encodeURIComponent(
                data.payload.refName,
              )}\n`,
            ),
          );
        }
      }

      message.write("\n");
    } else if (data.packType === GitServer.PackType.UPLOAD) {
      // Finally, accept the payload from client
      message.accept();

      // client has done something like "git clone" or "git fetch" or "git pull",
      // it is receiving, server is uploading
      console.log("upload-pack");
      // ⬇️ disabled because it seem to cause issues on git pull. ⬇️
      message.write(toAscii(`🖖 Welcome at GitFOSS ${data.username}!\n`));

      console.log("upload-pack:", data, message);
    }
  };
};

export default makeOnPushEvent;