Branch

repos.ts

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
b8a3bb Tucker McKnight
7e40e5 Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
7e40e5 Tucker McKnight
fb82fe Tucker McKnight
fb82fe Tucker McKnight
fb82fe Tucker McKnight
b8a3bb Tucker McKnight
7e40e5 Tucker McKnight
b8a3bb Tucker McKnight
fb82fe Tucker McKnight
fb82fe Tucker McKnight
fb82fe Tucker McKnight
b8a3bb Tucker McKnight
237651 Tucker McKnight
7e40e5 Tucker McKnight
7e40e5 Tucker McKnight
7e40e5 Tucker McKnight
7e40e5 Tucker McKnight
7e40e5 Tucker McKnight
7e40e5 Tucker McKnight
7e40e5 Tucker McKnight
7e40e5 Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
4f267d Tucker McKnight
b8a3bb Tucker McKnight
7e40e5 Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
4f267d Tucker McKnight
7e40e5 Tucker McKnight
7e40e5 Tucker McKnight
b8a3bb Tucker McKnight
7e40e5 Tucker McKnight
7e40e5 Tucker McKnight
fb82fe Tucker McKnight
7e40e5 Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
fb82fe Tucker McKnight
fb82fe Tucker McKnight
9c5544 Tucker McKnight
fb82fe Tucker McKnight
fb82fe Tucker McKnight
fb82fe Tucker McKnight
fb82fe Tucker McKnight
fb82fe Tucker McKnight
fb82fe Tucker McKnight
fb82fe Tucker McKnight
fb82fe Tucker McKnight
4f267d Tucker McKnight
7e40e5 Tucker McKnight
4f267d Tucker McKnight
fb82fe Tucker McKnight
fb82fe Tucker McKnight
7e40e5 Tucker McKnight
fb82fe Tucker McKnight
7e40e5 Tucker McKnight
7e40e5 Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
4f267d Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
b8a3bb Tucker McKnight
import {
  type ReposConfiguration,
  type GitConfig,
} from './configTypes.ts'
import { type Repository} from './dataTypes.ts'
import util from 'util'
import childProcess from 'child_process'
import cloneUrl from './vcses/git/helpers.ts'

import { addBranchToCommitsMap } from './vcses/git/operations.ts'
import { getLocation} from './helpers.ts'
import { getFileList } from './vcses/git/operations.ts'

const exec = util.promisify(childProcess.exec)

const getBranchNames = (repoConfig: GitConfig): Array<string> => {
  return repoConfig.branchesToPull.map((branch) => {
    if (typeof branch === "string") {
      return branch
    }
    else {
      return "" // todo
    }
  })
}

let cachedRepos: Array<Repository> | null = null

const repos: (reposConfig: ReposConfiguration) => Promise<Array<Repository>> = async (reposConfig) => {
  if (cachedRepos !== null) { return cachedRepos }

  const repoNames = Object.keys(reposConfig.repos)
  cachedRepos = []

  for (const repoName of repoNames) {
    const branchNames = getBranchNames(reposConfig.repos[repoName])
    const commits: Repository['commits'] = new Map()
    for (const branchName of branchNames) {
      const repoLocation = getLocation(reposConfig, repoName)
      await addBranchToCommitsMap(branchName, repoLocation, commits)
    }

    const branches = await Promise.all(branchNames.map(async (branchName) => {
      const repoLocation = getLocation(reposConfig, repoName)
      const branchHeadRes = await exec(`git -C ${repoLocation} show-ref refs/heads/${branchName}`)
      const branchHead = branchHeadRes.stdout.split(" ")[0]
      return {
        name: branchName,
        head: branchHead,
        fileList: await getFileList(branchName, repoLocation)
      }
    }))

    cachedRepos.push({
      name: repoName,
      description: reposConfig.repos[repoName].description,
      branches,
      cloneUrl: cloneUrl.cloneUrl(reposConfig.baseUrl, repoName),
      defaultBranch: "main",
      tags: [], // todo
      commits,
    })
  }

  return cachedRepos
}

export default repos