Skip to content

Here's how I show last commit & history of directories / files #16206

Closed
@lchrennew

Description

@lchrennew
  • Gitea version (or commit ref): 1.14.2
  • Git version:
  • Operating system:
  • Database (use [x]):
    • PostgreSQL
    • MySQL
    • MSSQL
    • SQLite
  • Can you reproduce the bug at https://try.gitea.io:
    • Yes (provide example URL)
    • No
  • Log gist:

Description

...

Hello there,

I'm sharing my implementation for showing last commit and commits of directories and files via api.

I do this by myself because the APIs of current version of Gitea not provide these. (expecting new version will).

I use redis to build indices:

  1. Build last commit sha index for all files of each commit.
  2. Build commit history index for each file changed in each commit.
  3. Build commit summary index for each commit.

last commit sha index

key:

`{files:${owner}:${repo}}:${ref}` // ref is sha of commit or refs/tags/... or refs/heads/...

value: Hash<filename, sha>, every path visible, including the root path, are tracked.

When a commit is pushed to a branch:

  1. if the branch does not exist before(the key doesn't exist), copy the files of the before commit to this branch. using redis COPY command.
  2. update all paths affected by files changed on the branch. using redis HMSET command.
  3. copy the files of the branch to the after commit. usinig redis COPY command.

To ls a path, you could combine the response of GET /repos/{owner}/{repo}/contents/{filepath} API and the result of HMGET command.

commit history index:

key:

`{commits:${owner}:${repo}}:${sha}:${filename}`

value: List<sha>, all commits' sha are tracked in newer to older order.

When a commit is pushed to a branch:

  1. if the branch does not exist before(the key doesn't exist), push the sha of the before commit to all paths affected by files changed on this branch. using redis LPUSH command.
  2. push the sha of the after commit to all paths affected by files changed on this branch. using redis LPUSH command.
  3. copy all paths updated on this branch to the after commit. using redis COPY command.
  4. create commit summary: HMSET {commit:$owner:$repo}:$sha message '$message' timestamp '$timestamp' author '$author'

To query history of a path, you could use LRANGE to get the SHA list and then use MGET to get commit summaries.

Screenshots

Metadata

Metadata

Assignees

No one assigned

    Labels

    modifies/apiThis PR adds API routes or modifies them

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions