git-pkgs 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,125 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rugged"
4
+
5
+ module Git
6
+ module Pkgs
7
+ class Repository
8
+ attr_reader :path
9
+
10
+ def initialize(path = Dir.pwd)
11
+ @path = path
12
+ @rugged = Rugged::Repository.new(path)
13
+ end
14
+
15
+ def git_dir
16
+ @rugged.path.chomp("/")
17
+ end
18
+
19
+ def default_branch
20
+ # Try origin/HEAD first (what GitHub/GitLab set as default)
21
+ if @rugged.references["refs/remotes/origin/HEAD"]
22
+ ref = @rugged.references["refs/remotes/origin/HEAD"].resolve
23
+ return ref.name.sub("refs/remotes/origin/", "")
24
+ end
25
+
26
+ # Fall back to current HEAD
27
+ head = @rugged.head
28
+ head.name.sub("refs/heads/", "")
29
+ rescue Rugged::ReferenceError
30
+ # Last resort: common default names
31
+ %w[main master].find { |name| branch_exists?(name) } || "main"
32
+ end
33
+
34
+ def branch_exists?(name)
35
+ @rugged.branches[name] != nil
36
+ end
37
+
38
+ def branch_target(name)
39
+ @rugged.branches[name]&.target_id
40
+ end
41
+
42
+ def walk(branch_name, since_sha = nil)
43
+ walker = Rugged::Walker.new(@rugged)
44
+ walker.sorting(Rugged::SORT_TOPO | Rugged::SORT_REVERSE)
45
+
46
+ branch = @rugged.branches[branch_name]
47
+ raise Error, "Branch '#{branch_name}' not found" unless branch
48
+
49
+ if since_sha
50
+ begin
51
+ walker.hide(@rugged.lookup(since_sha).oid)
52
+ rescue Rugged::OdbError
53
+ # Commit not found, walk from beginning
54
+ end
55
+ end
56
+
57
+ walker.push(branch.target_id)
58
+ walker
59
+ end
60
+
61
+ def lookup(sha)
62
+ @rugged.lookup(sha)
63
+ end
64
+
65
+ def blob_paths(rugged_commit)
66
+ paths = []
67
+
68
+ if rugged_commit.parents.empty?
69
+ rugged_commit.tree.walk_blobs(:postorder) do |root, entry|
70
+ paths << {
71
+ status: :added,
72
+ path: "#{root}#{entry[:name]}"
73
+ }
74
+ end
75
+ else
76
+ diffs = rugged_commit.parents[0].diff(rugged_commit)
77
+ diffs.each_delta do |delta|
78
+ paths << {
79
+ status: delta.status,
80
+ path: delta.new_file[:path]
81
+ }
82
+ end
83
+ end
84
+
85
+ paths
86
+ end
87
+
88
+ def content_at_commit(rugged_commit, file_path)
89
+ entry = rugged_commit.tree.path(file_path)
90
+ blob = @rugged.lookup(entry[:oid])
91
+ blob.content
92
+ rescue Rugged::TreeError
93
+ nil
94
+ end
95
+
96
+ def content_before_commit(rugged_commit, file_path)
97
+ return nil if rugged_commit.parents.empty?
98
+
99
+ content_at_commit(rugged_commit.parents[0], file_path)
100
+ end
101
+
102
+ def blob_oid_at_commit(rugged_commit, file_path)
103
+ entry = rugged_commit.tree.path(file_path)
104
+ entry[:oid]
105
+ rescue Rugged::TreeError
106
+ nil
107
+ end
108
+
109
+ def blob_content(oid)
110
+ blob = @rugged.lookup(oid)
111
+ blob.content
112
+ rescue Rugged::OdbError
113
+ nil
114
+ end
115
+
116
+ def merge_commit?(rugged_commit)
117
+ rugged_commit.parents.length > 1
118
+ end
119
+
120
+ def head_sha
121
+ @rugged.head.target_id
122
+ end
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Git
4
+ module Pkgs
5
+ VERSION = "0.1.0"
6
+ end
7
+ end
data/lib/git/pkgs.rb ADDED
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "pkgs/version"
4
+ require_relative "pkgs/cli"
5
+ require_relative "pkgs/database"
6
+ require_relative "pkgs/repository"
7
+ require_relative "pkgs/analyzer"
8
+
9
+ require_relative "pkgs/models/branch"
10
+ require_relative "pkgs/models/branch_commit"
11
+ require_relative "pkgs/models/commit"
12
+ require_relative "pkgs/models/manifest"
13
+ require_relative "pkgs/models/dependency_change"
14
+ require_relative "pkgs/models/dependency_snapshot"
15
+
16
+ require_relative "pkgs/commands/init"
17
+ require_relative "pkgs/commands/update"
18
+ require_relative "pkgs/commands/hooks"
19
+ require_relative "pkgs/commands/info"
20
+ require_relative "pkgs/commands/list"
21
+ require_relative "pkgs/commands/history"
22
+ require_relative "pkgs/commands/why"
23
+ require_relative "pkgs/commands/blame"
24
+ require_relative "pkgs/commands/outdated"
25
+ require_relative "pkgs/commands/stats"
26
+ require_relative "pkgs/commands/diff"
27
+ require_relative "pkgs/commands/tree"
28
+ require_relative "pkgs/commands/branch"
29
+ require_relative "pkgs/commands/search"
30
+
31
+ module Git
32
+ module Pkgs
33
+ class Error < StandardError; end
34
+ class NotInitializedError < Error; end
35
+ class NotInGitRepoError < Error; end
36
+ end
37
+ end
metadata ADDED
@@ -0,0 +1,138 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: git-pkgs
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Andrew Nesbitt
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: rugged
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '1.0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '1.0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: activerecord
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '7.0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '7.0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: sqlite3
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '2.0'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '2.0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: ecosystems-bibliothecary
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ description: A git subcommand for analyzing package/dependency usage in git repositories
69
+ over time
70
+ email:
71
+ - andrewnez@gmail.com
72
+ executables:
73
+ - git-pkgs
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - CHANGELOG.md
78
+ - CODE_OF_CONDUCT.md
79
+ - LICENSE
80
+ - README.md
81
+ - Rakefile
82
+ - benchmark_bulk.rb
83
+ - benchmark_db.rb
84
+ - benchmark_detailed.rb
85
+ - benchmark_full.rb
86
+ - docs/schema.md
87
+ - exe/git-pkgs
88
+ - lib/git/pkgs.rb
89
+ - lib/git/pkgs/analyzer.rb
90
+ - lib/git/pkgs/cli.rb
91
+ - lib/git/pkgs/commands/blame.rb
92
+ - lib/git/pkgs/commands/branch.rb
93
+ - lib/git/pkgs/commands/diff.rb
94
+ - lib/git/pkgs/commands/history.rb
95
+ - lib/git/pkgs/commands/hooks.rb
96
+ - lib/git/pkgs/commands/info.rb
97
+ - lib/git/pkgs/commands/init.rb
98
+ - lib/git/pkgs/commands/list.rb
99
+ - lib/git/pkgs/commands/outdated.rb
100
+ - lib/git/pkgs/commands/search.rb
101
+ - lib/git/pkgs/commands/stats.rb
102
+ - lib/git/pkgs/commands/tree.rb
103
+ - lib/git/pkgs/commands/update.rb
104
+ - lib/git/pkgs/commands/why.rb
105
+ - lib/git/pkgs/database.rb
106
+ - lib/git/pkgs/models/branch.rb
107
+ - lib/git/pkgs/models/branch_commit.rb
108
+ - lib/git/pkgs/models/commit.rb
109
+ - lib/git/pkgs/models/dependency_change.rb
110
+ - lib/git/pkgs/models/dependency_snapshot.rb
111
+ - lib/git/pkgs/models/manifest.rb
112
+ - lib/git/pkgs/repository.rb
113
+ - lib/git/pkgs/version.rb
114
+ homepage: https://github.com/andrew/git-pkgs
115
+ licenses:
116
+ - AGPL-3.0
117
+ metadata:
118
+ homepage_uri: https://github.com/andrew/git-pkgs
119
+ source_code_uri: https://github.com/andrew/git-pkgs
120
+ changelog_uri: https://github.com/andrew/git-pkgs/blob/main/CHANGELOG.md
121
+ rdoc_options: []
122
+ require_paths:
123
+ - lib
124
+ required_ruby_version: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: 3.2.0
129
+ required_rubygems_version: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - ">="
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ requirements: []
135
+ rubygems_version: 4.0.1
136
+ specification_version: 4
137
+ summary: Track package dependencies across git history
138
+ test_files: []