{"id":16022763,"url":"https://github.com/smacker/ast-log","last_synced_at":"2025-09-21T06:07:28.701Z","repository":{"id":141959364,"uuid":"213393844","full_name":"smacker/ast-log","owner":"smacker","description":"Just like `git log -p` but for an ast node (function, method, class, ...)","archived":false,"fork":false,"pushed_at":"2023-02-14T22:26:12.000Z","size":20,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-01-02T18:48:40.624Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","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/smacker.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":"2019-10-07T13:41:28.000Z","updated_at":"2019-10-07T13:50:28.000Z","dependencies_parsed_at":"2024-05-31T08:45:15.921Z","dependency_job_id":null,"html_url":"https://github.com/smacker/ast-log","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/smacker%2Fast-log","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smacker%2Fast-log/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smacker%2Fast-log/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smacker%2Fast-log/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/smacker","download_url":"https://codeload.github.com/smacker/ast-log/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240131773,"owners_count":19752725,"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":[],"created_at":"2024-10-08T18:41:39.509Z","updated_at":"2025-09-21T06:07:23.659Z","avatar_url":"https://github.com/smacker.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# AST log\n\nJust like `git log -p` but for an ast node (function, method, class, ...).\n\nThe difference from `git log -L start,end:file` it traces changes based on tree diff instead of text diff.\n\n### Usage\n\n```\nast-log -r \u003crepo-path\u003e -f \u003cfile-path\u003e\n# find node id in the output\n\nast-log -r \u003crepo-path\u003e -f \u003cfile-path\u003e --id \u003cnode-id\u003e\n```\n\n### Dependencies\n\nCurrently the command depends on [bblfshd](https://github.com/bblfsh/bblfshd/) and expects the server running on `0.0.0.0:9432`.\n\n### Example output\n\n```diff\n$ go run main.go -r /Users/smacker/go/src/gopkg.in/src-d/go-git.v4 -f repository.go --id 2611\ncommit 02335b10dee417d0338bf6ea070feeead18e636b\nAuthor: Jeremy Chambers \u003cjeremy@thehipbot.com\u003e\nDate:   Sat Apr 07 14:34:39 2018 -0500\n\n    config: adds branches to config for tracking branches against remotes, updates clone to track when cloning a branch. Fixes #313\n\n    Signed-off-by: Jeremy Chambers \u003cjeremy@thehipbot.com\u003e\n\n\n--- Original\n+++ Current\n@@ -51,5 +51,27 @@\n \t\t}\n \t}\n\n-\treturn r.updateRemoteConfigIfNeeded(o, c, ref)\n+\tif err := r.updateRemoteConfigIfNeeded(o, c, ref); err != nil {\n+\t\treturn err\n+\t}\n+\n+\tif ref.Name().IsBranch() {\n+\t\tbranchRef := ref.Name()\n+\t\tbranchName := strings.Split(string(branchRef), \"refs/heads/\")[1]\n+\n+\t\tb := \u0026config.Branch{\n+\t\t\tName:  branchName,\n+\t\t\tMerge: branchRef,\n+\t\t}\n+\t\tif o.RemoteName == \"\" {\n+\t\t\tb.Remote = \"origin\"\n+\t\t} else {\n+\t\t\tb.Remote = o.RemoteName\n+\t\t}\n+\t\tif err := r.CreateBranch(b); err != nil {\n+\t\t\treturn err\n+\t\t}\n+\t}\n+\n+\treturn nil\n }\n\ncommit 591aed138177b27b08a90c90e6e074a6cf2dbd00\nAuthor: Michael Rykov \u003cmrykov@gmail.com\u003e\nDate:   Mon Jan 15 12:32:53 2018 -0800\n\n    Support for clone without checkout\n\n--- Original\n+++ Current\n@@ -23,7 +23,7 @@\n \t\treturn err\n \t}\n\n-\tif r.wt != nil {\n+\tif r.wt != nil \u0026\u0026 !o.NoCheckout {\n \t\tw, err := r.Worktree()\n \t\tif err != nil {\n \t\t\treturn err\n\ncommit caa4dc4729e50e3a10ccd438d02d69fa20f9b766\nAuthor: Máximo Cuadros \u003cmcuadros@gmail.com\u003e\nDate:   Thu Nov 23 07:19:39 2017 +0100\n\n    update to go-billy.v4 and go-git-fixtures.v3\n\n    Signed-off-by: Máximo Cuadros \u003cmcuadros@gmail.com\u003e\n\n\n--- Original\n+++ Current\n@@ -12,11 +12,12 @@\n \t\treturn err\n \t}\n\n-\thead, err := r.fetchAndUpdateReferences(ctx, \u0026FetchOptions{\n+\tref, err := r.fetchAndUpdateReferences(ctx, \u0026FetchOptions{\n \t\tRefSpecs: r.cloneRefSpec(o, c),\n \t\tDepth:    o.Depth,\n \t\tAuth:     o.Auth,\n \t\tProgress: o.Progress,\n+\t\tTags:     o.Tags,\n \t}, o.ReferenceName)\n \tif err != nil {\n \t\treturn err\n@@ -28,7 +29,15 @@\n \t\t\treturn err\n \t\t}\n\n-\t\tif err := w.Reset(\u0026ResetOptions{Commit: head.Hash()}); err != nil {\n+\t\thead, err := r.Head()\n+\t\tif err != nil {\n+\t\t\treturn err\n+\t\t}\n+\n+\t\tif err := w.Reset(\u0026ResetOptions{\n+\t\t\tMode:   MergeReset,\n+\t\t\tCommit: head.Hash(),\n+\t\t}); err != nil {\n \t\t\treturn err\n \t\t}\n\n@@ -42,5 +51,5 @@\n \t\t}\n \t}\n\n-\treturn r.updateRemoteConfigIfNeeded(o, c, head)\n+\treturn r.updateRemoteConfigIfNeeded(o, c, ref)\n }\n\ncommit e09fa242c1f97547527fa0cb9f6288f9ae17479e\nAuthor: Máximo Cuadros \u003cmcuadros@gmail.com\u003e\nDate:   Mon Nov 20 01:55:48 2017 +0100\n\n    plumbing: object, commit.Parent() method\n\n    Signed-off-by: Máximo Cuadros \u003cmcuadros@gmail.com\u003e\n\n\n--- Original\n+++ Current\n@@ -12,12 +12,11 @@\n \t\treturn err\n \t}\n\n-\tref, err := r.fetchAndUpdateReferences(ctx, \u0026FetchOptions{\n+\thead, err := r.fetchAndUpdateReferences(ctx, \u0026FetchOptions{\n \t\tRefSpecs: r.cloneRefSpec(o, c),\n \t\tDepth:    o.Depth,\n \t\tAuth:     o.Auth,\n \t\tProgress: o.Progress,\n-\t\tTags:     o.Tags,\n \t}, o.ReferenceName)\n \tif err != nil {\n \t\treturn err\n@@ -29,15 +28,7 @@\n \t\t\treturn err\n \t\t}\n\n-\t\thead, err := r.Head()\n-\t\tif err != nil {\n-\t\t\treturn err\n-\t\t}\n-\n-\t\tif err := w.Reset(\u0026ResetOptions{\n-\t\t\tMode:   MergeReset,\n-\t\t\tCommit: head.Hash(),\n-\t\t}); err != nil {\n+\t\tif err := w.Reset(\u0026ResetOptions{Commit: head.Hash()}); err != nil {\n \t\t\treturn err\n \t\t}\n\n@@ -51,5 +42,5 @@\n \t\t}\n \t}\n\n-\treturn r.updateRemoteConfigIfNeeded(o, c, ref)\n+\treturn r.updateRemoteConfigIfNeeded(o, c, head)\n }\n\ncommit 7cdc44306dd1b3bba4a219bf3c40c5097a505a8e\nAuthor: Máximo Cuadros \u003cmcuadros@gmail.com\u003e\nDate:   Mon Sep 04 13:54:02 2017 +0200\n\n    Repository.Clone added Tags option, and set by default AllTags as git does\n\n\n--- Original\n+++ Current\n@@ -17,6 +17,7 @@\n \t\tDepth:    o.Depth,\n \t\tAuth:     o.Auth,\n \t\tProgress: o.Progress,\n+\t\tTags:     o.Tags,\n \t}, o.ReferenceName)\n \tif err != nil {\n \t\treturn err\n\ncommit f1e58e0d30095cf768ff04d379b5e4145a874be8\nAuthor: Máximo Cuadros \u003cmcuadros@gmail.com\u003e\nDate:   Fri Sep 01 17:26:52 2017 +0200\n\n    Worktree.Reset ignore untracked files on Merge mode\n\n\n--- Original\n+++ Current\n@@ -12,7 +12,7 @@\n \t\treturn err\n \t}\n\n-\thead, err := r.fetchAndUpdateReferences(ctx, \u0026FetchOptions{\n+\tref, err := r.fetchAndUpdateReferences(ctx, \u0026FetchOptions{\n \t\tRefSpecs: r.cloneRefSpec(o, c),\n \t\tDepth:    o.Depth,\n \t\tAuth:     o.Auth,\n@@ -28,7 +28,15 @@\n \t\t\treturn err\n \t\t}\n\n-\t\tif err := w.Reset(\u0026ResetOptions{Commit: head.Hash()}); err != nil {\n+\t\thead, err := r.Head()\n+\t\tif err != nil {\n+\t\t\treturn err\n+\t\t}\n+\n+\t\tif err := w.Reset(\u0026ResetOptions{\n+\t\t\tMode:   MergeReset,\n+\t\t\tCommit: head.Hash(),\n+\t\t}); err != nil {\n \t\t\treturn err\n \t\t}\n\n@@ -42,5 +50,5 @@\n \t\t}\n \t}\n\n-\treturn r.updateRemoteConfigIfNeeded(o, c, head)\n+\treturn r.updateRemoteConfigIfNeeded(o, c, ref)\n }\n\ncommit 5a7b7af0f793b1c25e9543e8511b767f3b739d67\nAuthor: Miguel Molina \u003cmiguel@erizocosmi.co\u003e\nDate:   Thu Aug 24 17:35:38 2017 +0200\n\n    dotgit: rewrite the way references are looked up\n    Now there's only two ways of getting a reference, by checking under refs/ directory or in packed-refs. refs/ directory is checked using a direct read by reference name and packed refs are cached until they have been changed.\n\n    Signed-off-by: Miguel Molina \u003cmiguel@erizocosmi.co\u003e\n\n\n--- Original\n+++ Current\n@@ -12,7 +12,7 @@\n \t\treturn err\n \t}\n\n-\tref, err := r.fetchAndUpdateReferences(ctx, \u0026FetchOptions{\n+\thead, err := r.fetchAndUpdateReferences(ctx, \u0026FetchOptions{\n \t\tRefSpecs: r.cloneRefSpec(o, c),\n \t\tDepth:    o.Depth,\n \t\tAuth:     o.Auth,\n@@ -24,11 +24,6 @@\n\n \tif r.wt != nil {\n \t\tw, err := r.Worktree()\n-\t\tif err != nil {\n-\t\t\treturn err\n-\t\t}\n-\n-\t\thead, err := r.Head()\n \t\tif err != nil {\n \t\t\treturn err\n \t\t}\n@@ -47,5 +42,5 @@\n \t\t}\n \t}\n\n-\treturn r.updateRemoteConfigIfNeeded(o, c, ref)\n+\treturn r.updateRemoteConfigIfNeeded(o, c, head)\n }\n\ncommit 17cde59e5ced61adece4741b3a4da947f08fd9dc\nAuthor: Ori Rawlings \u003corirawlings@gmail.com\u003e\nDate:   Wed Aug 23 22:39:25 2017 -0500\n\n    repository: Resolve commit when cloning annotated tag, fixes #557\n\n\n--- Original\n+++ Current\n@@ -12,7 +12,7 @@\n \t\treturn err\n \t}\n\n-\thead, err := r.fetchAndUpdateReferences(ctx, \u0026FetchOptions{\n+\tref, err := r.fetchAndUpdateReferences(ctx, \u0026FetchOptions{\n \t\tRefSpecs: r.cloneRefSpec(o, c),\n \t\tDepth:    o.Depth,\n \t\tAuth:     o.Auth,\n@@ -24,6 +24,11 @@\n\n \tif r.wt != nil {\n \t\tw, err := r.Worktree()\n+\t\tif err != nil {\n+\t\t\treturn err\n+\t\t}\n+\n+\t\thead, err := r.Head()\n \t\tif err != nil {\n \t\t\treturn err\n \t\t}\n@@ -42,5 +47,5 @@\n \t\t}\n \t}\n\n-\treturn r.updateRemoteConfigIfNeeded(o, c, head)\n+\treturn r.updateRemoteConfigIfNeeded(o, c, ref)\n }\n\ncommit a0b45cc5508ae48b01799ca800e464888ed598be\nAuthor: Josh Bleecher Snyder \u003cjosharian@gmail.com\u003e\nDate:   Thu Aug 03 16:46:57 2017 -0700\n\n    plumbing/object: add Commit.FirstParent\n\n    First parents are somewhat special in git.\n    There's even a --first-parent flag to 'git log'.\n\n    Add a helper method to look them up.\n    This avoids boilerplate and spares the client from\n    having to arrange for a handle to the Storer,\n    which is stored in the unexported field Commit.s.\n\n\n\n\n--- Original\n+++ Current\n@@ -5,7 +5,7 @@\n\n \tc := \u0026config.RemoteConfig{\n \t\tName: o.RemoteName,\n-\t\tURL:  o.URL,\n+\t\tURLs: []string{o.URL},\n \t}\n\n \tif _, err := r.CreateRemote(c); err != nil {\n\ncommit c128f5d680f59fd125cafd90f10e39eae5f3a135\nAuthor: Jeremy Stribling \u003cstrib@keyba.se\u003e\nDate:   Mon Jul 31 15:34:45 2017 -0700\n\n    plumbing: fix pack commands for the file client on Windows\n\n    The default git install on Windows doesn't come with commands for\n    receive-pack and upload-pack in the default $PATH.  Instead, use\n    --exec-path to find pack executables in that case.\n\n\n--- Original\n+++ Current\n@@ -5,7 +5,7 @@\n\n \tc := \u0026config.RemoteConfig{\n \t\tName: o.RemoteName,\n-\t\tURLs: []string{o.URL},\n+\t\tURL:  o.URL,\n \t}\n\n \tif _, err := r.CreateRemote(c); err != nil {\n\ncommit b29ccd9cf64cb3c6d7b3fdc6649d97416f3be734\nAuthor: Manuel Carmona \u003cmanu.carmona90@gmail.com\u003e\nDate:   Thu Aug 03 09:41:22 2017 +0200\n\n    *: windows support, some more fixes (#533)\n\n    * fixed windows failed test: \"134 FAIL: repository_test.go:340: RepositorySuite.TestPlainOpenBareRelativeGitDirFileTrailingGarbage\"\n\n    * fixed windows failed test: \"143 FAIL: worktree_test.go:367: WorktreeSuite.TestCheckoutIndexOS\"\n\n    * fixed windows failed test: \"296 FAIL: receive_pack_test.go:36: ReceivePackSuite.TearDownTest\"\n\n    * fixed windows failed test: \"152 FAIL: worktree_test.go:278: WorktreeSuite.TestCheckoutSymlink\"\n\n\n--- Original\n+++ Current\n@@ -5,7 +5,7 @@\n\n \tc := \u0026config.RemoteConfig{\n \t\tName: o.RemoteName,\n-\t\tURL:  o.URL,\n+\t\tURLs: []string{o.URL},\n \t}\n\n \tif _, err := r.CreateRemote(c); err != nil {\n\ncommit 5c1a2ec798eb9b78d66b16fbbcbdc3b928d8b496\nAuthor: Máximo Cuadros \u003cmcuadros@gmail.com\u003e\nDate:   Wed Aug 02 17:28:02 2017 +0200\n\n    worktree: normalized string comparison tests\n\n\n--- Original\n+++ Current\n@@ -5,7 +5,7 @@\n\n \tc := \u0026config.RemoteConfig{\n \t\tName: o.RemoteName,\n-\t\tURLs: []string{o.URL},\n+\t\tURL:  o.URL,\n \t}\n\n \tif _, err := r.CreateRemote(c); err != nil {\n\ncommit 595de2b38d0cee2e0bc92e1a0559f16ccca851dc\nAuthor: Máximo Cuadros \u003cmcuadros@gmail.com\u003e\nDate:   Wed Aug 02 14:26:58 2017 +0200\n\n    Remote.Clone fix clone of tags in shallow mode\n\n\n--- Original\n+++ Current\n@@ -5,7 +5,7 @@\n\n \tc := \u0026config.RemoteConfig{\n \t\tName: o.RemoteName,\n-\t\tURL:  o.URL,\n+\t\tURLs: []string{o.URL},\n \t}\n\n \tif _, err := r.CreateRemote(c); err != nil {\n@@ -33,7 +33,10 @@\n \t\t}\n\n \t\tif o.RecurseSubmodules != NoRecurseSubmodules {\n-\t\t\tif err := w.updateSubmodules(o.RecurseSubmodules); err != nil {\n+\t\t\tif err := w.updateSubmodules(\u0026SubmoduleUpdateOptions{\n+\t\t\t\tRecurseSubmodules: o.RecurseSubmodules,\n+\t\t\t\tAuth:              o.Auth,\n+\t\t\t}); err != nil {\n \t\t\t\treturn err\n \t\t\t}\n \t\t}\n\ncommit 171b3a73e7ab7015f9eb8e98965e36dfb8ea9599\nAuthor: Máximo Cuadros \u003cmcuadros@gmail.com\u003e\nDate:   Wed Aug 02 13:00:31 2017 +0200\n\n    plumbing: moved `Reference.Is*` methods to `ReferenceName.Is*`\n\n\n--- Original\n+++ Current\n@@ -5,7 +5,7 @@\n\n \tc := \u0026config.RemoteConfig{\n \t\tName: o.RemoteName,\n-\t\tURLs: []string{o.URL},\n+\t\tURL:  o.URL,\n \t}\n\n \tif _, err := r.CreateRemote(c); err != nil {\n\ncommit 9488c59834f6a2591910b7b360721cec2c16c548\nAuthor: Santiago M. Mola \u003csanti@mola.io\u003e\nDate:   Mon Jul 24 10:51:01 2017 +0200\n\n    config: multiple values in RemoteConfig (URLs and Fetch)\n\n    * Change `URL string` to `URL []string` in `RemoteConfig`, since\n      git allows multiple URLs per remote. See:\n      http://marc.info/?l=git\u0026m=116231242118202\u0026w=2\n\n    * Fix marshalling of multiple fetch refspecs.\n\n\n--- Original\n+++ Current\n@@ -5,7 +5,7 @@\n\n \tc := \u0026config.RemoteConfig{\n \t\tName: o.RemoteName,\n-\t\tURL:  o.URL,\n+\t\tURLs: []string{o.URL},\n \t}\n\n \tif _, err := r.CreateRemote(c); err != nil {\n@@ -33,10 +33,7 @@\n \t\t}\n\n \t\tif o.RecurseSubmodules != NoRecurseSubmodules {\n-\t\t\tif err := w.updateSubmodules(\u0026SubmoduleUpdateOptions{\n-\t\t\t\tRecurseSubmodules: o.RecurseSubmodules,\n-\t\t\t\tAuth:              o.Auth,\n-\t\t\t}); err != nil {\n+\t\t\tif err := w.updateSubmodules(o.RecurseSubmodules); err != nil {\n \t\t\t\treturn err\n \t\t\t}\n \t\t}\n\ncommit 63b30fba572b7e70833fae4785c6d22f167c6641\nAuthor: Devon Barrett \u003cdevon@devonbarrett.net\u003e\nDate:   Sat Jul 29 14:12:57 2017 +0200\n\n    reuse Auth method when recursing submodules, fixes #521\n\n\n--- Original\n+++ Current\n@@ -33,7 +33,10 @@\n \t\t}\n\n \t\tif o.RecurseSubmodules != NoRecurseSubmodules {\n-\t\t\tif err := w.updateSubmodules(o.RecurseSubmodules); err != nil {\n+\t\t\tif err := w.updateSubmodules(\u0026SubmoduleUpdateOptions{\n+\t\t\t\tRecurseSubmodules: o.RecurseSubmodules,\n+\t\t\t\tAuth:              o.Auth,\n+\t\t\t}); err != nil {\n \t\t\t\treturn err\n \t\t\t}\n \t\t}\n\ncommit ab590eb89849a0319b8c5a4d7fd980137da7180d\nAuthor: Máximo Cuadros \u003cmcuadros@gmail.com\u003e\nDate:   Wed Jul 26 21:46:49 2017 +0200\n\n    worktree: expose underlying filesystem\n\n\n--- Original\n+++ Current\n@@ -1,4 +1,4 @@\n-func (r *Repository) clone(o *CloneOptions) error {\n+func (r *Repository) clone(ctx context.Context, o *CloneOptions) error {\n \tif err := o.Validate(); err != nil {\n \t\treturn err\n \t}\n@@ -12,7 +12,7 @@\n \t\treturn err\n \t}\n\n-\thead, err := r.fetchAndUpdateReferences(\u0026FetchOptions{\n+\thead, err := r.fetchAndUpdateReferences(ctx, \u0026FetchOptions{\n \t\tRefSpecs: r.cloneRefSpec(o, c),\n \t\tDepth:    o.Depth,\n \t\tAuth:     o.Auth,\n\ncommit c64eb817d5e5cbaec10dea1342e1ec95721e886b\nAuthor: Santiago M. Mola \u003csanti@mola.io\u003e\nDate:   Tue Jul 25 10:08:36 2017 +0200\n\n    packfile: create packfile.Index and reuse it\n\n    There was an internal type (i.e. storage/filesystem.idx) to\n    use as in-memory index for packfiles. This was not convenient\n    to reuse in the packfile.\n\n    This commit creates a new representation (format/packfile.Index)\n    that can be converted to and from idxfile.Idxfile.\n\n    A packfile.Index now contains the functionality that was scattered\n    on storage/filesystem.idx and packfile.Decoder's internals.\n\n    storage/filesystem now reuses packfile.Index instances and this\n    also results in higher cache hit ratios when resolving deltas.\n\n\n--- Original\n+++ Current\n@@ -1,4 +1,4 @@\n-func (r *Repository) clone(ctx context.Context, o *CloneOptions) error {\n+func (r *Repository) clone(o *CloneOptions) error {\n \tif err := o.Validate(); err != nil {\n \t\treturn err\n \t}\n@@ -12,7 +12,7 @@\n \t\treturn err\n \t}\n\n-\thead, err := r.fetchAndUpdateReferences(ctx, \u0026FetchOptions{\n+\thead, err := r.fetchAndUpdateReferences(\u0026FetchOptions{\n \t\tRefSpecs: r.cloneRefSpec(o, c),\n \t\tDepth:    o.Depth,\n \t\tAuth:     o.Auth,\n\ncommit 064051f972e90dd55e6c941f04b58b4a36dfedf1\nAuthor: Máximo Cuadros \u003cmcuadros@gmail.com\u003e\nDate:   Wed Jul 26 06:24:47 2017 +0200\n\n    *: package context support in Repository, Remote and Submodule\n\n\n--- Original\n+++ Current\n@@ -1 +1,43 @@\n+func (r *Repository) clone(ctx context.Context, o *CloneOptions) error {\n+\tif err := o.Validate(); err != nil {\n+\t\treturn err\n+\t}\n\n+\tc := \u0026config.RemoteConfig{\n+\t\tName: o.RemoteName,\n+\t\tURL:  o.URL,\n+\t}\n+\n+\tif _, err := r.CreateRemote(c); err != nil {\n+\t\treturn err\n+\t}\n+\n+\thead, err := r.fetchAndUpdateReferences(ctx, \u0026FetchOptions{\n+\t\tRefSpecs: r.cloneRefSpec(o, c),\n+\t\tDepth:    o.Depth,\n+\t\tAuth:     o.Auth,\n+\t\tProgress: o.Progress,\n+\t}, o.ReferenceName)\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\n+\tif r.wt != nil {\n+\t\tw, err := r.Worktree()\n+\t\tif err != nil {\n+\t\t\treturn err\n+\t\t}\n+\n+\t\tif err := w.Reset(\u0026ResetOptions{Commit: head.Hash()}); err != nil {\n+\t\t\treturn err\n+\t\t}\n+\n+\t\tif o.RecurseSubmodules != NoRecurseSubmodules {\n+\t\t\tif err := w.updateSubmodules(o.RecurseSubmodules); err != nil {\n+\t\t\t\treturn err\n+\t\t\t}\n+\t\t}\n+\t}\n+\n+\treturn r.updateRemoteConfigIfNeeded(o, c, head)\n+}\n```\n\n### Known issues \u0026 TODO\n\n- Performance\n\n    It works slow as hell. Timing for the log above:\n\n    ```\n    Total time\t43.952412822s\t100%\n    Go-git operations time\t11.821716895s\t26%\n    Bblfsh parsing time\t28.499216239s\t64%\n    Gum matching time\t3.566183643s\t8%\n    ```\n\n    Possible solution could be to switch to tree-sitter which is _much_ faster than bblfsh and the tool can take advantage of incremental parsing. Then take a look why go-git operations are so slow and optimize them.\n\n- Lack of human interface for choosing target node\n\n    Possible solution could be to accept line:char and suggest to choose a node on at this position.\n\n- Incorrect matching \n\n    In some cases the node can be match \"incorrectly\" (according to human expectations).\n\n    Possible solution could be to tune ast diff algorithm for this particular case.\n\n### Thanks\n\n- Jean-Rémy Falleri for [GumTreeDiff/gumtree](https://github.com/GumTreeDiff/gumtree) and the paper [Fine-grained and Accurate Source Code Differencing](https://hal.archives-ouvertes.fr/hal-01054552/document).\n- Patrick Mézard for [go-difflib](https://github.com/pmezard/go-difflib) library.\n- Source{d} for [bblfsh](https://github.com/bblfsh/bblfshd) and [go-git](https://github.com/src-d/go-git).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsmacker%2Fast-log","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsmacker%2Fast-log","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsmacker%2Fast-log/lists"}