gitstamp 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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 1774534fb07609cd455470e861ec4b0afd377e8b8b46c4123b5a673084388d03
4
+ data.tar.gz: a814125b30c20e4d42934c9141265a711d699189c2c7e3446033db473b9c440d
5
+ SHA512:
6
+ metadata.gz: 9c00982820e2af67d2dea03d4e53d81aeb53e066e0878dec11ff31c814035b795bd0345fcaba4b64c952d7c51262d474a378476327cef0ad26f8a353c21db00b
7
+ data.tar.gz: 816b1398692ac5a41d63bb5e50be645ebacbd4c196324259a0c431ed4a338799076a99eecd681bb603506c96f3c4a442d7b1a26ede5ae73590634cf0f54b6fbc
data/AUTHORS ADDED
@@ -0,0 +1 @@
1
+ Arto Bendiken <arto@bendiken.net>
data/CHANGES.md ADDED
@@ -0,0 +1,6 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
data/CREDITS.md ADDED
@@ -0,0 +1 @@
1
+ # Credits
data/README.md ADDED
@@ -0,0 +1,26 @@
1
+ # Gitstamp Command-Line Interface (CLI)
2
+
3
+ [![Project license](https://img.shields.io/badge/license-Public%20Domain-blue.svg)](https://unlicense.org)
4
+ [![Ruby compatibility](https://img.shields.io/badge/ruby-2.4%2B-blue)](https://rubygems.org/gems/gitstamp)
5
+ [![RubyGems gem](https://img.shields.io/gem/v/gitstamp.svg)](https://rubygems.org/gems/gitstamp)
6
+
7
+ ## Prerequisites
8
+
9
+ - [Ruby](https://www.ruby-lang.org/en/) 2.4+
10
+
11
+ ## Installation
12
+
13
+ The tool can be installed quickly and easily on any computer that has [Ruby]
14
+ available:
15
+
16
+ ```bash
17
+ $ gem install gitstamp
18
+ ```
19
+
20
+ In case the command wasn't found after installation, you likely need to
21
+ configure your `PATH` environment variable to include your [RubyGems] program
22
+ path.
23
+
24
+ [Ruby]: https://www.ruby-lang.org/en/
25
+ [RubyGems]: https://guides.rubygems.org/faqs/
26
+ [Unlicense]: https://unlicense.org
data/UNLICENSE ADDED
@@ -0,0 +1,24 @@
1
+ This is free and unencumbered software released into the public domain.
2
+
3
+ Anyone is free to copy, modify, publish, use, compile, sell, or
4
+ distribute this software, either in source code form or as a compiled
5
+ binary, for any purpose, commercial or non-commercial, and by any
6
+ means.
7
+
8
+ In jurisdictions that recognize copyright laws, the author or authors
9
+ of this software dedicate any and all copyright interest in the
10
+ software to the public domain. We make this dedication for the benefit
11
+ of the public at large and to the detriment of our heirs and
12
+ successors. We intend this dedication to be an overt act of
13
+ relinquishment in perpetuity of all present and future rights to this
14
+ software under copyright law.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19
+ IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20
+ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
+ OTHER DEALINGS IN THE SOFTWARE.
23
+
24
+ For more information, please refer to <https://unlicense.org/>
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
data/bin/gitstamp ADDED
@@ -0,0 +1,76 @@
1
+ #!/usr/bin/env ruby -W1
2
+ # This is free and unencumbered software released into the public domain.
3
+
4
+ require_relative '../lib/gitstamp'
5
+
6
+ require 'arweave' # https://rubygems.org/gems/arweave
7
+ require 'rugged' # https://rubygems.org/gems/rugged
8
+ require 'thor' # https://rubygems.org/gems/thor
9
+
10
+ require 'json'
11
+
12
+ class CLI < Thor
13
+ def self.exit_on_failure?() true end
14
+
15
+ class_option :debug, aliases: '-d', type: :boolean, desc: "Enable debugging"
16
+ class_option :verbose, aliases: '-v', type: :boolean, desc: "Be verbose (print warnings)"
17
+ class_option :quiet, aliases: '-q', type: :boolean, desc: "Be quiet (silence non-fatal errors)"
18
+ class_option :wallet, aliases: '-W', banner: 'FILE', desc: "Specify Arweave wallet FILE (in JWK format)"
19
+
20
+ desc "publish COMMIT...", "Publish commits to Gitstamp"
21
+ option :author, banner: 'URI', desc: "Override author URI (mailto: or https://)"
22
+ option :committer, banner: 'URI', desc: "Override committer URI (mailto: or https://)"
23
+ option :link, banner: 'URL', desc: "Include commit link URL (https://)"
24
+ def publish(*commits)
25
+ wallet = self.wallet
26
+ author, committer, link = self.options[:author], self.options[:committer], self.options[:link]
27
+ git = Rugged::Repository.new('.')
28
+ commits = commits.empty? ? [git.head.target] : commits.map { |sha1| git.lookup(sha1) }
29
+ commits.each do |commit|
30
+ commit = Gitstamp::Commit.from_git(commit, author: author, committer: committer, link: link)
31
+ warn commit.to_tags.inspect if debug?
32
+ transaction_id = Gitstamp::Transaction.new(commit).publish!(wallet)
33
+ puts "#{set_color(transaction_id, :green)}" unless quiet?
34
+ end
35
+ rescue => error
36
+ raise error if debug?
37
+ warn "#{$0}: #{set_color(error, :red)}"
38
+ exit error.respond_to?(:exit_code) ? error.exit_code : -1
39
+ end
40
+
41
+ protected
42
+
43
+ def wallet
44
+ @wallet ||= begin
45
+ wallet_path = self.options[:wallet]
46
+ raise "wallet path required" if wallet_path.nil?
47
+ raise "#{wallet_path}: wallet file not found" if !File.exist?(wallet_path)
48
+ begin
49
+ Arweave::Wallet.new(JSON.parse(File.read(wallet_path)))
50
+ rescue JSON::ParserError => error
51
+ raise "#{wallet_path}: #{error}"
52
+ end
53
+ end
54
+ end
55
+
56
+ def debug?() self.options[:debug] end
57
+ def verbose?() self.options[:verbose] || self.debug? end
58
+ def quiet?() self.options[:quiet] end
59
+ end # CLI
60
+
61
+ # Fix for https://github.com/erikhuda/thor/issues/398
62
+ class Thor::Shell::Basic
63
+ def print_wrapped(message, options = {})
64
+ indent = (options[:indent] || 0).to_i
65
+ if indent.zero?
66
+ self.stdout.puts message
67
+ else
68
+ message.each_line do |message_line|
69
+ self.stdout.print ' ' * indent
70
+ self.stdout.puts message_line.chomp
71
+ end
72
+ end
73
+ end
74
+ end # Thor::Shell::Basic
75
+
76
+ CLI.start(ARGV)
@@ -0,0 +1,40 @@
1
+ # This is free and unencumbered software released into the public domain.
2
+
3
+ ##
4
+ # A Gitstamp commit contains the Git commit message and relevant metadata.
5
+ class Gitstamp::Commit < ::Struct.new(:id, :link, :author, :committer, :committer_date, :message, keyword_init: true)
6
+ ##
7
+ # Constructs a Gitstamp commit from a Git commit.
8
+ #
9
+ # @param [Rugged::Commit] git the Git commit object
10
+ # @param [URI, #to_s] author an optional author URI override
11
+ # @param [URI, #to_s] committer an optional committer URI override
12
+ # @param [URI, #to_s] link an optional commit link URL
13
+ # @return [Commit]
14
+ def self.from_git(git, author: nil, committer: nil, link: nil)
15
+ self.new(
16
+ id: git.oid.to_s,
17
+ link: link&.to_s,
18
+ author: (author || "mailto:#{git.author[:email]}").to_s,
19
+ committer: (committer || "mailto:#{git.committer[:email]}").to_s,
20
+ committer_date: git.committer[:time], # preserves the timezone
21
+ message: git.message.to_s,
22
+ )
23
+ end
24
+
25
+ ##
26
+ # Returns the Arweave metadata tags for this commit.
27
+ #
28
+ # @return [Hash<String, String>]
29
+ def to_tags
30
+ {
31
+ 'Content-Type' => 'text/plain',
32
+ 'App-Name' => 'Gitstamp',
33
+ 'Git-Commit' => self.id.to_s,
34
+ 'Git-Commit-Link' => self.link&.to_s,
35
+ 'Git-Author' => self.author&.to_s,
36
+ 'Git-Committer' => self.committer&.to_s,
37
+ 'Git-Committer-Date' => self.committer_date&.strftime("%Y-%m-%dT%H:%M:%S%:z"),
38
+ }.delete_if { |k, v| v.nil? }
39
+ end
40
+ end # Gitstamp::Commit
@@ -0,0 +1,44 @@
1
+ # This is free and unencumbered software released into the public domain.
2
+
3
+ ##
4
+ # A Gitstamp transaction is an Arweave transaction with specific tags.
5
+ class Gitstamp::Transaction
6
+ ##
7
+ # The transaction's associated commit.
8
+ #
9
+ # @return [Commit] commit
10
+ attr_reader :commit
11
+
12
+ ##
13
+ # Constructs a transaction from a commit.
14
+ #
15
+ # @param [Commit] commit
16
+ # @return [void]
17
+ def initialize(commit)
18
+ @commit = commit
19
+ end
20
+
21
+ ##
22
+ # Signs this transaction as originating from the given wallet.
23
+ #
24
+ # @param [Arweave::Wallet] wallet
25
+ # @return [Arweave::Transaction] the signed Arweave transaction
26
+ def sign(wallet)
27
+ tx = Arweave::Transaction.new(data: @commit.message.to_s)
28
+ @commit.to_tags.each do |name, value|
29
+ tx.add_tag(name: name, value: value)
30
+ end
31
+ tx.sign(wallet)
32
+ end
33
+
34
+ ##
35
+ # Submits this transaction to the Arweave network.
36
+ #
37
+ # @param [Arweave::Wallet] wallet
38
+ # @return [String] the posted Arweave transaction ID
39
+ def publish!(wallet)
40
+ tx = self.sign(wallet)
41
+ tx.commit
42
+ tx.attributes[:id]
43
+ end
44
+ end # Gitstamp::Transaction
@@ -0,0 +1,21 @@
1
+ # This is free and unencumbered software released into the public domain.
2
+
3
+ module Gitstamp
4
+ module VERSION
5
+ FILE = File.expand_path('../../VERSION', __dir__).freeze
6
+ STRING = File.read(FILE).chomp.freeze
7
+ MAJOR, MINOR, PATCH, EXTRA = STRING.split('.').map(&:to_i).freeze
8
+
9
+ ##
10
+ # @return [String]
11
+ def self.to_s() STRING end
12
+
13
+ ##
14
+ # @return [String]
15
+ def self.to_str() STRING end
16
+
17
+ ##
18
+ # @return [Array(Integer, Integer, Integer)]
19
+ def self.to_a() [MAJOR, MINOR, PATCH].freeze end
20
+ end # VERSION
21
+ end # Gitstamp
data/lib/gitstamp.rb ADDED
@@ -0,0 +1,6 @@
1
+ # This is free and unencumbered software released into the public domain.
2
+
3
+ require_relative 'gitstamp/version'
4
+
5
+ require_relative 'gitstamp/commit'
6
+ require_relative 'gitstamp/transaction'
metadata ADDED
@@ -0,0 +1,143 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gitstamp
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Arto Bendiken
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-09-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '13'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '13'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '3.9'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '3.9'
41
+ - !ruby/object:Gem::Dependency
42
+ name: yard
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0.9'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0.9'
55
+ - !ruby/object:Gem::Dependency
56
+ name: arweave
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.1'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.1'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rugged
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: thor
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.0'
97
+ description: Gitstamp Command-Line Interface (CLI)
98
+ email: arto@bendiken.net
99
+ executables:
100
+ - gitstamp
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - AUTHORS
105
+ - CHANGES.md
106
+ - CREDITS.md
107
+ - README.md
108
+ - UNLICENSE
109
+ - VERSION
110
+ - bin/gitstamp
111
+ - lib/gitstamp.rb
112
+ - lib/gitstamp/commit.rb
113
+ - lib/gitstamp/transaction.rb
114
+ - lib/gitstamp/version.rb
115
+ homepage: https://github.com/artob/gitstamp-cli
116
+ licenses:
117
+ - Unlicense
118
+ metadata:
119
+ bug_tracker_uri: https://github.com/artob/gitstamp-cli/issues
120
+ changelog_uri: https://github.com/artob/gitstamp-cli/blob/master/CHANGES.md
121
+ documentation_uri: https://www.rubydoc.info/github/artob/gitstamp-cli/master
122
+ homepage_uri: https://gitstamp.dev
123
+ source_code_uri: https://github.com/artob/gitstamp-cli
124
+ post_install_message:
125
+ rdoc_options: []
126
+ require_paths:
127
+ - lib
128
+ required_ruby_version: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: 2.4.0
133
+ required_rubygems_version: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: 2.6.8
138
+ requirements: []
139
+ rubygems_version: 3.1.2
140
+ signing_key:
141
+ specification_version: 4
142
+ summary: Gitstamp Command-Line Interface (CLI)
143
+ test_files: []