{"id":33204878,"url":"https://github.com/GrammaTech/resolve","last_synced_at":"2025-11-16T19:01:25.115Z","repository":{"id":45795772,"uuid":"184614630","full_name":"GrammaTech/resolve","owner":"GrammaTech","description":"Resolve software differencing and merging","archived":false,"fork":false,"pushed_at":"2022-07-15T18:46:07.000Z","size":2721,"stargazers_count":37,"open_issues_count":0,"forks_count":0,"subscribers_count":13,"default_branch":"master","last_synced_at":"2024-05-02T22:12:37.772Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/GrammaTech.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-05-02T16:27:00.000Z","updated_at":"2023-08-17T13:24:04.000Z","dependencies_parsed_at":"2022-07-17T01:16:01.114Z","dependency_job_id":null,"html_url":"https://github.com/GrammaTech/resolve","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/GrammaTech/resolve","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GrammaTech%2Fresolve","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GrammaTech%2Fresolve/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GrammaTech%2Fresolve/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GrammaTech%2Fresolve/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/GrammaTech","download_url":"https://codeload.github.com/GrammaTech/resolve/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GrammaTech%2Fresolve/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":284759739,"owners_count":27058842,"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","status":"online","status_checked_at":"2025-11-16T02:00:05.974Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":[],"created_at":"2025-11-16T10:00:19.805Z","updated_at":"2025-11-16T19:01:25.110Z","avatar_url":"https://github.com/GrammaTech.png","language":"C++","readme":"Resolve\n=======\n\nTRL: 6\n\nSoftware AST-based diff calculation, display, and automated resolution.\n\n\u003cdiv style=\"color: #eeeeec; background-color: #2e3436; padding:0.25em; max-width:50em;\"\u003e\n\u003cpre\u003e\n\u003cspan style=\"color: #b4fa70; background-color: #2e3436;\"\u003e# Example output of git configured to use Resolve's \u003cspan style=\"background-color: #555753;\"\u003east-diff\u003c/span\u003e command\u003c/span\u003e\n\u003cspan style=\"color: #b4fa70; background-color: #2e3436;\"\u003e$ \u003c/span\u003e\u003cspan style=\"background-color: #2e3436; font-weight: bold;\"\u003egit diff HEAD~2..HEAD~1 -- src/event.js\u003c/span\u003e\u003cspan style=\"background-color: #2e3436;\"\u003e\nast-diff src/event.js\nindex cb70e8eb..b63b93b9 100644\n\u003c/span\u003e\u003cspan style=\"color: #8cc4ff; background-color: #2e3436;\"\u003eline: 589\u003c/span\u003e\u003cspan style=\"background-color: #2e3436;\"\u003e\n// synthetic events by interrupting progress until reinvoked in response to\n// *native* events that it fires directly, ensuring that state changes have\n// already occurred before other listeners are invoked.\nfunction leverageNative( el, type, \u003c/span\u003e\u003cspan style=\"color: #ff4b4b; background-color: #2e3436;\"\u003e[-forceAdd, -]\u003c/span\u003e\u003cspan style=\"color: #b4fa70; background-color: #2e3436;\"\u003e{+expectSync+}\u003c/span\u003e\u003cspan style=\"color: #ff4b4b; background-color: #2e3436;\"\u003e[-allowAsync-]\u003c/span\u003e\u003cspan style=\"background-color: #2e3436;\"\u003e ) \u003c/span\u003e\u003cspan style=\"color: #b4fa70; background-color: #2e3436;\"\u003e{+{\u003c/span\u003e\u003cspan style=\"background-color: #2e3436;\"\u003e\n\n\u003c/span\u003e\u003cspan style=\"color: #b4fa70; background-color: #2e3436;\"\u003e        // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add\u003c/span\u003e\u003cspan style=\"background-color: #2e3436;\"\u003e\n\u003c/span\u003e\u003cspan style=\"color: #b4fa70; background-color: #2e3436;\"\u003e        +}\u003c/span\u003e\u003cspan style=\"color: #ff4b4b; background-color: #2e3436;\"\u003e[-{\u003c/span\u003e\u003cspan style=\"background-color: #2e3436;\"\u003e\n\n\u003c/span\u003e\u003cspan style=\"color: #ff4b4b; background-color: #2e3436;\"\u003e        // Setup must go through jQuery.event.add-]\u003c/span\u003e\u003cspan style=\"background-color: #2e3436;\"\u003e\n\u003c/span\u003e\u003cspan style=\"color: #ff4b4b; background-color: #2e3436;\"\u003e        \u003c/span\u003e\u003cspan style=\"background-color: #2e3436;\"\u003eif ( \u003c/span\u003e\u003cspan style=\"color: #b4fa70; background-color: #2e3436;\"\u003e{+!expectSync+}\u003c/span\u003e\u003cspan style=\"color: #ff4b4b; background-color: #2e3436;\"\u003e[-forceAdd-]\u003c/span\u003e\u003cspan style=\"background-color: #2e3436;\"\u003e ) {\n                jQuery.event.add( el, type, \u003c/span\u003e\u003cspan style=\"color: #b4fa70; background-color: #2e3436;\"\u003e{+returnTrue+}\u003c/span\u003e\u003cspan style=\"color: #ff4b4b; background-color: #2e3436;\"\u003e[-forceAdd-]\u003c/span\u003e\u003cspan style=\"background-color: #2e3436;\"\u003e );\n                return;\n        }\n\n\u003c/span\u003e\u003cspan style=\"color: #8cc4ff; background-color: #2e3436;\"\u003eline: 603\u003c/span\u003e\u003cspan style=\"background-color: #2e3436;\"\u003e\n        // Register the controller as a special universal handler for all event namespaces\n        dataPriv.set( el, type, \u003c/span\u003e\u003cspan style=\"color: #b4fa70; background-color: #2e3436;\"\u003e{+false+}\u003c/span\u003e\u003cspan style=\"color: #ff4b4b; background-color: #2e3436;\"\u003e[-forceAdd-]\u003c/span\u003e\u003cspan style=\"background-color: #2e3436;\"\u003e );\n        jQuery.event.add( el, type, {\n                namespace: false,\n                handler: function( event ) {\n                        var \u003c/span\u003e\u003cspan style=\"color: #b4fa70; background-color: #2e3436;\"\u003e{+notAsync+}\u003c/span\u003e\u003cspan style=\"color: #ff4b4b; background-color: #2e3436;\"\u003e[-maybeAsync-]\u003c/span\u003e\u003cspan style=\"background-color: #2e3436;\"\u003e, result,\n                                saved = dataPriv.get( this, type );\u003c/span\u003e\u003c/pre\u003e\n\u003c/div\u003e\n\n## Abstract\nResolve implements multi-lingual semantic differencing of software\nsource code and implements an automated technique of merge conflict\nresolution.  This provides developers with more meaningful views of\nsoftware changes and it frees developers from the tedious manual task\nof merge conflict resolution.\n\n## Usage\n\nYou can get pre-built binaries of `ast-diff` and `ast-merge` for AMD64\nfrom the [releases page][].\n\nIf you want to build them yourself:\n\n1. Check out the submodules for this repository.\n    git submodule update --init --recursive\n2. Install [SBCL][] and [Quicklisp][].\n3. In this repository, run\n    make bin/ast-diff\n    make bin/ast-merge\n\n## Use Cases\n\n### Improved difference calculation and view\nSenior developers spend a significant portion of their time reviewing\nthe work products of other developers.  The primary mode of\nrepresenting these work products are as differences against the\nexisting code base.  By calculating syntactically aware differences\nover software abstract syntax trees (ASTs) we provide more informative\nand meaningful views of software changes.\n\n#### Limitations\n\nCurrently the reliability of printed diffs is limited. In particular\nirregular indentation may result in malformed diffs or errors during\ndiff printing.\n\nThis is in consequence of the high-level representation of ASTs in\nResolve: because the representation abstracts away details such as\nindentation and syntactic delimiters and separators, they have to be\ncarefully reconstructed to present the result to humans.\n\n### Automated merge conflict resolution\nOn project with multiple developers, a significant portion of time is\ntypically spent manually resolving conflicting changes between\nparallel branches of development.  By automatically resolving merge\nconflicts we are able to save projects a significant amount of\nexpensive developer time and free developers from the often tedious\njob of manual conflict resolution.\n\n## Tools\n- command-line AST differencing\n- web-based AST differencing\n- test-suite guided merge conflict resolution\n\n## Language Support\n\nResolve supports any language that can be parsed by [tree-sitter][]\nand represented by [SEL][]. This includes, but is not limited to:\n\n- C\n- C++\n- JavaScript\n- Python\n- TypeScript\n- Rust\n\n## Copyright and License\n\nCopyright (c) 2020 GrammaTech, Inc.\n\nSee [LICENSE.txt](LICENSE.txt) for more information.\n\nWe ask that all contributors complete our Contributor License\nAgreement (CLA), which can be found at\n[GrammaTech-CLA-resolve.pdf](./GrammaTech-CLA-resolve.pdf),\nand email the completed form to `CLA@GrammaTech.com`.  Under this\nagreement contributors retain the copyright to their work but grants\nGrammaTech unlimited license to the work.\n\n## Acknowledgment\nThis material is based upon work supported by the Defense Advanced\nResearch Projects Agency (DARPA) under Contract No. D17PC00096. Any\nopinions, findings and conclusions or recommendations expressed in\nthis material are those of the author(s) and do not necessarily\nreflect the views of the Defense Advanced Research Projects Agency\n(DARPA); or its Contracting Agent, the U.S. Department of the\nInterior, Interior Business Center, Acquisition Services Directorate,\nDivision III.\n\n[tree-sitter]: https://tree-sitter.github.io/tree-sitter/\n[SEL]: https://github.com/GrammaTech/sel\n[releases-page]: https://github.com/GrammaTech/resolve/releases\n[SBCL]: http://www.sbcl.org\n[Quicklisp]: https://www.quicklisp.org/beta/\n","funding_links":[],"categories":["North America","Online editors ##"],"sub_categories":["United States","Third-party APIs"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FGrammaTech%2Fresolve","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FGrammaTech%2Fresolve","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FGrammaTech%2Fresolve/lists"}