-
-
Notifications
You must be signed in to change notification settings - Fork 5.9k
Closed
Labels
modifies/apiThis PR adds API routes or modifies themThis PR adds API routes or modifies them
Description
- Gitea version (or commit ref): 1.14.2
- Git version:
- Operating system:
- Database (use
[x]
):- PostgreSQLMySQLMSSQLSQLiteTo pick up a draggable item, press the space bar. While dragging, use the arrow keys to move the item. Press space again to drop the item in its new position, or press escape to cancel.
- Can you reproduce the bug at https://try.gitea.io:
- Yes (provide example URL)NoTo pick up a draggable item, press the space bar. While dragging, use the arrow keys to move the item. Press space again to drop the item in its new position, or press escape to cancel.
- 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:
- Build last commit sha index for all files of each commit.
- Build commit history index for each file changed in each commit.
- 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:
- if the branch does not exist before(the key doesn't exist), copy the files of the
before
commit to this branch. using redisCOPY
command. - update all paths affected by files changed on the branch. using redis
HMSET
command. - copy the files of the branch to the
after
commit. usinig redisCOPY
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:
- 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 redisLPUSH
command. - push the sha of the
after
commit to all paths affected by files changed on this branch. using redisLPUSH
command. - copy all paths updated on this branch to the
after
commit. using redisCOPY
command. - 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
Labels
modifies/apiThis PR adds API routes or modifies themThis PR adds API routes or modifies them
Type
Projects
Milestone
Relationships
Development
Select code repository
Activity
Add API to get file commit history (#17652)
Add API to get file commit history (go-gitea#17652)