{"id":13478487,"url":"https://github.com/hpjansson/fornalder","last_synced_at":"2025-03-16T18:31:37.096Z","repository":{"id":49392394,"uuid":"321808369","full_name":"hpjansson/fornalder","owner":"hpjansson","description":"Visualize long-term trends in collections of Git repositories.","archived":false,"fork":false,"pushed_at":"2022-12-25T21:59:07.000Z","size":79,"stargazers_count":96,"open_issues_count":5,"forks_count":10,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-03-15T05:48:03.012Z","etag":null,"topics":["analysis","community","community-health","developers","git","history","metrics-visualization","plots","statistics"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hpjansson.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"COPYING","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-12-15T22:51:03.000Z","updated_at":"2024-11-14T08:17:32.000Z","dependencies_parsed_at":"2023-01-30T22:45:35.000Z","dependency_job_id":null,"html_url":"https://github.com/hpjansson/fornalder","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hpjansson%2Ffornalder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hpjansson%2Ffornalder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hpjansson%2Ffornalder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hpjansson%2Ffornalder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hpjansson","download_url":"https://codeload.github.com/hpjansson/fornalder/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243826788,"owners_count":20354220,"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":["analysis","community","community-health","developers","git","history","metrics-visualization","plots","statistics"],"created_at":"2024-07-31T16:01:57.750Z","updated_at":"2025-03-16T18:31:36.650Z","avatar_url":"https://github.com/hpjansson.png","language":"Rust","funding_links":[],"categories":["Rust"],"sub_categories":[],"readme":"# Fornalder\n\nFornalder (\"Bygone Age\") is a small utility that can be used to ingest\ncommit data from collections of git repositories and visualize it in\nvarious ways.\n\nIt was used to generate the graphs in [this blog post](https://hpjansson.org/blag/2020/12/16/on-the-graying-of-gnome/). It's made to work with data going back a long time (a decade or two); with shorter time spans the output will probably look quite bad.\n\n## Building\n\n[Clone](https://github.com/git-guides/git-clone) the project repository and make sure you have the Rust prerequisites installed, then:\n\n```sh\n$ cargo build\n```\n\n## Using\n\nYou need a fairly recent version of Gnuplot to generate plots. Make sure\nit is installed.\n\nClone the repositories of interest to a local directory, then ingest them.\nThis can be run multiple times to add to or update the database:\n\n```sh\n$ target/debug/fornalder --meta projects/project-meta.json \\\n                         ingest db.sqlite repo-1.git repo-2.git ...\n```\n\nWhen the database has been created, generate one or more plots, e.g:\n\n```sh\n$ target/debug/fornalder --meta projects/project-meta.json \\\n                         plot db.sqlite \\\n                         --cohort firstyear \\\n                         --interval year \\\n                         --unit authors \\\n                         graph.png\n```\n\nIf something looks odd in the result, you can also explore the database directly.\n\n```sh\n$ sqlite3 db.sqlite\nsqlite\u003e .tables\nauthors      raw_commits\nsqlite\u003e .schema authors\nCREATE TABLE authors(\n  author_name TEXT,\n  first_time,\n  first_year,\n  last_time,\n  last_year,\n  active_time,\n  n_commits,\n  n_changes\n);\nsqlite\u003e SELECT author_name, first_year FROM authors ORDER BY first_year;\n[...]\n```\n\nGuide to arguments:\n\n```\n--meta \u003cmeta\u003e\n    Optional. Project metadata to use. See projects/ for examples.\n\n--cohort \u003c domain | firstyear | prefix | repo | suffix \u003e\n    Optional. How to split the data into cohorts.\n\n--interval \u003c year | month \u003e\n    Optional. Time interval of each histogram bin.\n\n--unit \u003c authors | changes | commits \u003e\n    Optional. What's being measured -- active authors, number of lines\n    changed, or commit count.\n\n--from year\n    Optional. First year to plot.\n\n--to year\n    Optional. Last year to plot.\n```\n\n\n## Git cloning tips\n\nWe support ingestion from both bare and non-bare repositories:\n\n    git clone https://git.example.com\n    git clone --bare https://git.example.com\n\nAnother option that can massively reduce data transfer is `--filter=blob:none`, which will only clone commit metadata, not the files themselves.\n\n    git clone --bare --filter=blob:none https://git.example.com\n\nNote that this is not supported by all git servers (cloning may fail). Using this mode also prevents the use of the `--unit changes` option (counting the number of changed lines), or in general inspecting `--stat` output from the commit database.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhpjansson%2Ffornalder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhpjansson%2Ffornalder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhpjansson%2Ffornalder/lists"}