{"id":16504770,"url":"https://github.com/vaibhavsagar/duffer","last_synced_at":"2025-03-21T08:31:04.606Z","repository":{"id":76013235,"uuid":"53212401","full_name":"vaibhavsagar/duffer","owner":"vaibhavsagar","description":"A git-compatible content tracker in Haskell.","archived":false,"fork":false,"pushed_at":"2020-01-10T19:03:52.000Z","size":2179,"stargazers_count":67,"open_issues_count":12,"forks_count":4,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-03-17T22:54:41.484Z","etag":null,"topics":["git","haskell"],"latest_commit_sha":null,"homepage":"http://vaibhavsagar.com/duffer","language":"Haskell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vaibhavsagar.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-03-05T17:00:34.000Z","updated_at":"2025-02-26T21:08:09.000Z","dependencies_parsed_at":"2023-02-26T03:30:09.922Z","dependency_job_id":null,"html_url":"https://github.com/vaibhavsagar/duffer","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vaibhavsagar%2Fduffer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vaibhavsagar%2Fduffer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vaibhavsagar%2Fduffer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vaibhavsagar%2Fduffer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vaibhavsagar","download_url":"https://codeload.github.com/vaibhavsagar/duffer/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244764838,"owners_count":20506716,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["git","haskell"],"created_at":"2024-10-11T15:06:42.158Z","updated_at":"2025-03-21T08:31:04.601Z","avatar_url":"https://github.com/vaibhavsagar.png","language":"Haskell","funding_links":[],"categories":[],"sub_categories":[],"readme":"duffer\n=========\n[![Build Status](https://travis-ci.org/vaibhavsagar/duffer.svg?branch=master)](https://travis-ci.org/vaibhavsagar/duffer)\n[![made at Recurse Center](https://cdn.rawgit.com/heatherbooker/made_at_rc/master/made_at_RC.svg)](https://www.recurse.com)\n\nThis is a learning exercise and an API for `git`, in that order. Please do not\nuse this code in production. Instead I would recommend Vincent Hanquez's\nexcellent and very educational [hs-git](https://github.com/vincenthz/hs-git/).\n\nI [gave a presentation](https://www.youtube.com/watch?v=wsNnP3we_R4) on this\nproject.\n\n# What this library does\n\n- Reads and writes loose blobs, trees, commits, and tags.\n- Reads full packfiles.\n- Reads and writes git refs.\n\n# Some things this library does not do (yet)\n\n- Generate a packfile index from a packfile.\n- Support arbitrary backends besides file storage.\n- Read .git/index\n- Diffs (you can get surprisingly far without them!)\n- Provide Functor, Applicative, or Monad instances for a repository, whatever that means.\n\n# Goals\n\nAlthough this is primarily a way for me to learn both Haskell and `git` at the\nsame time, there a couple of (I think) cool things I would like to do with this\nlibrary:\n\n- Use `git` as a NoSQL store, i.e. using `git` data formats to persist data for\n  an application. [Irmin](https://github.com/mirage/irmin) is exactly this for\n  OCaml but I don't know of an equivalent in Haskell (although\n  [filestore](https://hackage.haskell.org/package/filestore) comes close). This\n  means eventually supporting pluggable backends like Irmin and `libgit2` do so\n  that you're not limited to a filesystem backend.\n- A GraphQL/other query language interface to a `git` repository's commits. If\n  commits form a beautiful acyclic directed graph, there has to be a better way\n  of querying them than `git log`.\n\n# Getting Started\n\n1. [Set up `stack`](https://docs.haskellstack.org/en/stable/README/) if you\n   haven't already.\n2. Clone this repository: `git clone git@github.com:vaibhavsagar/duffer.git`\n3. `cd duffer`\n4. `stack test`\n5. Tests should all pass. If they don't, please open an issue.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvaibhavsagar%2Fduffer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvaibhavsagar%2Fduffer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvaibhavsagar%2Fduffer/lists"}