jit 0.0.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/LICENSE.txt +674 -0
- data/bin/jit +21 -0
- data/lib/color.rb +32 -0
- data/lib/command.rb +62 -0
- data/lib/command/add.rb +65 -0
- data/lib/command/base.rb +92 -0
- data/lib/command/branch.rb +199 -0
- data/lib/command/checkout.rb +104 -0
- data/lib/command/cherry_pick.rb +51 -0
- data/lib/command/commit.rb +86 -0
- data/lib/command/config.rb +126 -0
- data/lib/command/diff.rb +114 -0
- data/lib/command/fetch.rb +116 -0
- data/lib/command/init.rb +41 -0
- data/lib/command/log.rb +188 -0
- data/lib/command/merge.rb +148 -0
- data/lib/command/push.rb +172 -0
- data/lib/command/receive_pack.rb +92 -0
- data/lib/command/remote.rb +55 -0
- data/lib/command/reset.rb +64 -0
- data/lib/command/rev_list.rb +33 -0
- data/lib/command/revert.rb +69 -0
- data/lib/command/rm.rb +105 -0
- data/lib/command/shared/fast_forward.rb +19 -0
- data/lib/command/shared/print_diff.rb +116 -0
- data/lib/command/shared/receive_objects.rb +37 -0
- data/lib/command/shared/remote_agent.rb +44 -0
- data/lib/command/shared/remote_client.rb +82 -0
- data/lib/command/shared/send_objects.rb +24 -0
- data/lib/command/shared/sequencing.rb +146 -0
- data/lib/command/shared/write_commit.rb +167 -0
- data/lib/command/status.rb +210 -0
- data/lib/command/upload_pack.rb +54 -0
- data/lib/config.rb +240 -0
- data/lib/config/stack.rb +42 -0
- data/lib/database.rb +112 -0
- data/lib/database/author.rb +27 -0
- data/lib/database/backends.rb +57 -0
- data/lib/database/blob.rb +24 -0
- data/lib/database/commit.rb +70 -0
- data/lib/database/entry.rb +7 -0
- data/lib/database/loose.rb +70 -0
- data/lib/database/packed.rb +75 -0
- data/lib/database/tree.rb +77 -0
- data/lib/database/tree_diff.rb +88 -0
- data/lib/diff.rb +46 -0
- data/lib/diff/combined.rb +72 -0
- data/lib/diff/hunk.rb +64 -0
- data/lib/diff/myers.rb +90 -0
- data/lib/editor.rb +59 -0
- data/lib/index.rb +212 -0
- data/lib/index/checksum.rb +44 -0
- data/lib/index/entry.rb +91 -0
- data/lib/lockfile.rb +55 -0
- data/lib/merge/bases.rb +38 -0
- data/lib/merge/common_ancestors.rb +77 -0
- data/lib/merge/diff3.rb +156 -0
- data/lib/merge/inputs.rb +42 -0
- data/lib/merge/resolve.rb +178 -0
- data/lib/pack.rb +45 -0
- data/lib/pack/compressor.rb +83 -0
- data/lib/pack/delta.rb +58 -0
- data/lib/pack/entry.rb +54 -0
- data/lib/pack/expander.rb +54 -0
- data/lib/pack/index.rb +100 -0
- data/lib/pack/indexer.rb +200 -0
- data/lib/pack/numbers.rb +79 -0
- data/lib/pack/reader.rb +98 -0
- data/lib/pack/stream.rb +80 -0
- data/lib/pack/unpacker.rb +62 -0
- data/lib/pack/window.rb +47 -0
- data/lib/pack/writer.rb +92 -0
- data/lib/pack/xdelta.rb +118 -0
- data/lib/pager.rb +24 -0
- data/lib/progress.rb +78 -0
- data/lib/refs.rb +260 -0
- data/lib/remotes.rb +82 -0
- data/lib/remotes/protocol.rb +82 -0
- data/lib/remotes/refspec.rb +70 -0
- data/lib/remotes/remote.rb +57 -0
- data/lib/repository.rb +64 -0
- data/lib/repository/divergence.rb +21 -0
- data/lib/repository/hard_reset.rb +35 -0
- data/lib/repository/inspector.rb +49 -0
- data/lib/repository/migration.rb +168 -0
- data/lib/repository/pending_commit.rb +60 -0
- data/lib/repository/sequencer.rb +118 -0
- data/lib/repository/status.rb +98 -0
- data/lib/rev_list.rb +244 -0
- data/lib/revision.rb +155 -0
- data/lib/sorted_hash.rb +17 -0
- data/lib/temp_file.rb +34 -0
- data/lib/workspace.rb +107 -0
- metadata +103 -9
data/lib/revision.rb
ADDED
@@ -0,0 +1,155 @@
|
|
1
|
+
class Revision
|
2
|
+
InvalidObject = Class.new(StandardError)
|
3
|
+
HintedError = Struct.new(:message, :hint)
|
4
|
+
|
5
|
+
Ref = Struct.new(:name) do
|
6
|
+
def resolve(context)
|
7
|
+
context.read_ref(name)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
Parent = Struct.new(:rev, :n) do
|
12
|
+
def resolve(context)
|
13
|
+
context.commit_parent(rev.resolve(context), n)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
Ancestor = Struct.new(:rev, :n) do
|
18
|
+
def resolve(context)
|
19
|
+
oid = rev.resolve(context)
|
20
|
+
n.times { oid = context.commit_parent(oid) }
|
21
|
+
oid
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
Upstream = Struct.new(:rev) do
|
26
|
+
def resolve(context)
|
27
|
+
name = context.upstream(rev.name)
|
28
|
+
context.read_ref(name)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
INVALID_NAME = /
|
33
|
+
^\.
|
34
|
+
| \/\.
|
35
|
+
| \.\.
|
36
|
+
| \/$
|
37
|
+
| \.lock$
|
38
|
+
| @\{
|
39
|
+
| [\x00-\x20*:?\[\\^~\x7f]
|
40
|
+
/x
|
41
|
+
|
42
|
+
PARENT = /^(.+)\^(\d*)$/
|
43
|
+
ANCESTOR = /^(.+)~(\d+)$/
|
44
|
+
UPSTREAM = /^(.*)@\{u(pstream)?\}$/i
|
45
|
+
|
46
|
+
HEAD = "HEAD"
|
47
|
+
|
48
|
+
REF_ALIASES = {
|
49
|
+
"@" => HEAD,
|
50
|
+
"" => HEAD
|
51
|
+
}
|
52
|
+
|
53
|
+
COMMIT = "commit"
|
54
|
+
|
55
|
+
def self.parse(revision)
|
56
|
+
if match = PARENT.match(revision)
|
57
|
+
rev = parse(match[1])
|
58
|
+
n = (match[2] == "") ? 1 : match[2].to_i
|
59
|
+
rev ? Parent.new(rev, n) : nil
|
60
|
+
elsif match = ANCESTOR.match(revision)
|
61
|
+
rev = parse(match[1])
|
62
|
+
rev ? Ancestor.new(rev, match[2].to_i) : nil
|
63
|
+
elsif match = UPSTREAM.match(revision)
|
64
|
+
rev = parse(match[1])
|
65
|
+
rev ? Upstream.new(rev) : nil
|
66
|
+
elsif valid_ref?(revision)
|
67
|
+
name = REF_ALIASES[revision] || revision
|
68
|
+
Ref.new(name)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.valid_ref?(revision)
|
73
|
+
INVALID_NAME =~ revision ? false : true
|
74
|
+
end
|
75
|
+
|
76
|
+
attr_reader :errors
|
77
|
+
|
78
|
+
def initialize(repo, expression)
|
79
|
+
@repo = repo
|
80
|
+
@expr = expression
|
81
|
+
@query = Revision.parse(@expr)
|
82
|
+
@errors = []
|
83
|
+
end
|
84
|
+
|
85
|
+
def resolve(type = nil)
|
86
|
+
oid = @query&.resolve(self)
|
87
|
+
oid = nil if type and not load_typed_object(oid, type)
|
88
|
+
|
89
|
+
return oid if oid
|
90
|
+
|
91
|
+
raise InvalidObject, "Not a valid object name: '#{ @expr }'."
|
92
|
+
end
|
93
|
+
|
94
|
+
def read_ref(name)
|
95
|
+
oid = @repo.refs.read_ref(name)
|
96
|
+
return oid if oid
|
97
|
+
|
98
|
+
candidates = @repo.database.prefix_match(name)
|
99
|
+
return candidates.first if candidates.size == 1
|
100
|
+
|
101
|
+
if candidates.size > 1
|
102
|
+
log_ambiguous_sha1(name, candidates)
|
103
|
+
end
|
104
|
+
|
105
|
+
nil
|
106
|
+
end
|
107
|
+
|
108
|
+
def commit_parent(oid, n = 1)
|
109
|
+
return nil unless oid
|
110
|
+
|
111
|
+
commit = load_typed_object(oid, COMMIT)
|
112
|
+
return nil unless commit
|
113
|
+
|
114
|
+
commit.parents[n - 1]
|
115
|
+
end
|
116
|
+
|
117
|
+
def upstream(branch)
|
118
|
+
branch = @repo.refs.current_ref.short_name if branch == HEAD
|
119
|
+
@repo.remotes.get_upstream(branch)
|
120
|
+
end
|
121
|
+
|
122
|
+
private
|
123
|
+
|
124
|
+
def load_typed_object(oid, type)
|
125
|
+
return nil unless oid
|
126
|
+
|
127
|
+
object = @repo.database.load(oid)
|
128
|
+
|
129
|
+
if object.type == type
|
130
|
+
object
|
131
|
+
else
|
132
|
+
message = "object #{ oid } is a #{ object.type }, not a #{ type }"
|
133
|
+
@errors.push(HintedError.new(message, []))
|
134
|
+
nil
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def log_ambiguous_sha1(name, candidates)
|
139
|
+
objects = candidates.sort.map do |oid|
|
140
|
+
object = @repo.database.load(oid)
|
141
|
+
short = @repo.database.short_oid(object.oid)
|
142
|
+
info = " #{ short } #{ object.type }"
|
143
|
+
|
144
|
+
if object.type == COMMIT
|
145
|
+
"#{ info } #{ object.author.short_date } - #{ object.title_line }"
|
146
|
+
else
|
147
|
+
info
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
message = "short SHA1 #{ name } is ambiguous"
|
152
|
+
hint = ["The candidates are:"] + objects
|
153
|
+
@errors.push(HintedError.new(message, hint))
|
154
|
+
end
|
155
|
+
end
|
data/lib/sorted_hash.rb
ADDED
data/lib/temp_file.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
class TempFile
|
2
|
+
TEMP_CHARS = ("a".."z").to_a + ("A".."Z").to_a + ("0".."9").to_a
|
3
|
+
|
4
|
+
def initialize(dirname, prefix)
|
5
|
+
@dirname = dirname
|
6
|
+
@path = @dirname.join(generate_temp_name(prefix))
|
7
|
+
@file = nil
|
8
|
+
end
|
9
|
+
|
10
|
+
def write(data)
|
11
|
+
open_file unless @file
|
12
|
+
@file.write(data)
|
13
|
+
end
|
14
|
+
|
15
|
+
def move(name)
|
16
|
+
@file.close
|
17
|
+
File.rename(@path, @dirname.join(name))
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def generate_temp_name(prefix)
|
23
|
+
id = (1..6).map { TEMP_CHARS.sample }.join("")
|
24
|
+
"#{ prefix }_#{ id }"
|
25
|
+
end
|
26
|
+
|
27
|
+
def open_file
|
28
|
+
flags = File::RDWR | File::CREAT | File::EXCL
|
29
|
+
@file = File.open(@path, flags)
|
30
|
+
rescue Errno::ENOENT
|
31
|
+
Dir.mkdir(@dirname)
|
32
|
+
retry
|
33
|
+
end
|
34
|
+
end
|
data/lib/workspace.rb
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
require "fileutils"
|
2
|
+
|
3
|
+
class Workspace
|
4
|
+
MissingFile = Class.new(StandardError)
|
5
|
+
NoPermission = Class.new(StandardError)
|
6
|
+
|
7
|
+
IGNORE = [".", "..", ".git"]
|
8
|
+
|
9
|
+
def initialize(pathname)
|
10
|
+
@pathname = pathname
|
11
|
+
end
|
12
|
+
|
13
|
+
def list_files(path = @pathname)
|
14
|
+
relative = path.relative_path_from(@pathname)
|
15
|
+
|
16
|
+
if File.directory?(path)
|
17
|
+
filenames = Dir.entries(path) - IGNORE
|
18
|
+
filenames.flat_map { |name| list_files(path.join(name)) }
|
19
|
+
elsif File.exist?(path)
|
20
|
+
[relative]
|
21
|
+
else
|
22
|
+
raise MissingFile, "pathspec '#{ relative }' did not match any files"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def list_dir(dirname)
|
27
|
+
path = @pathname.join(dirname || "")
|
28
|
+
entries = Dir.entries(path) - IGNORE
|
29
|
+
stats = {}
|
30
|
+
|
31
|
+
entries.each do |name|
|
32
|
+
relative = path.join(name).relative_path_from(@pathname)
|
33
|
+
stats[relative.to_s] = File.stat(path.join(name))
|
34
|
+
end
|
35
|
+
|
36
|
+
stats
|
37
|
+
end
|
38
|
+
|
39
|
+
def read_file(path)
|
40
|
+
File.read(@pathname.join(path))
|
41
|
+
rescue Errno::EACCES
|
42
|
+
raise NoPermission, "open('#{ path }'): Permission denied"
|
43
|
+
end
|
44
|
+
|
45
|
+
def stat_file(path)
|
46
|
+
File.stat(@pathname.join(path))
|
47
|
+
rescue Errno::ENOENT, Errno::ENOTDIR
|
48
|
+
nil
|
49
|
+
rescue Errno::EACCES
|
50
|
+
raise NoPermission, "stat('#{ path }'): Permission denied"
|
51
|
+
end
|
52
|
+
|
53
|
+
def write_file(path, data, mode = nil, mkdir = false)
|
54
|
+
full_path = @pathname.join(path)
|
55
|
+
FileUtils.mkdir_p(full_path.dirname) if mkdir
|
56
|
+
|
57
|
+
flags = File::WRONLY | File::CREAT | File::TRUNC
|
58
|
+
File.open(full_path, flags) { |f| f.write(data) }
|
59
|
+
|
60
|
+
File.chmod(mode, full_path) if mode
|
61
|
+
end
|
62
|
+
|
63
|
+
def remove(path)
|
64
|
+
FileUtils.rm_rf(@pathname.join(path))
|
65
|
+
path.dirname.ascend { |dirname| remove_directory(dirname) }
|
66
|
+
rescue Errno::ENOENT
|
67
|
+
end
|
68
|
+
|
69
|
+
def apply_migration(migration)
|
70
|
+
apply_change_list(migration, :delete)
|
71
|
+
migration.rmdirs.sort.reverse_each { |dir| remove_directory(dir) }
|
72
|
+
|
73
|
+
migration.mkdirs.sort.each { |dir| make_directory(dir) }
|
74
|
+
apply_change_list(migration, :update)
|
75
|
+
apply_change_list(migration, :create)
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
|
80
|
+
def remove_directory(dirname)
|
81
|
+
Dir.rmdir(@pathname.join(dirname))
|
82
|
+
rescue Errno::ENOENT, Errno::ENOTDIR, Errno::ENOTEMPTY
|
83
|
+
end
|
84
|
+
|
85
|
+
def make_directory(dirname)
|
86
|
+
path = @pathname.join(dirname)
|
87
|
+
stat = stat_file(dirname)
|
88
|
+
|
89
|
+
File.unlink(path) if stat&.file?
|
90
|
+
Dir.mkdir(path) unless stat&.directory?
|
91
|
+
end
|
92
|
+
|
93
|
+
def apply_change_list(migration, action)
|
94
|
+
migration.changes[action].each do |filename, entry|
|
95
|
+
path = @pathname.join(filename)
|
96
|
+
|
97
|
+
FileUtils.rm_rf(path)
|
98
|
+
next if action == :delete
|
99
|
+
|
100
|
+
flags = File::WRONLY | File::CREAT | File::EXCL
|
101
|
+
data = migration.blob_data(entry.oid)
|
102
|
+
|
103
|
+
File.open(path, flags) { |file| file.write(data) }
|
104
|
+
File.chmod(entry.mode, path)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
metadata
CHANGED
@@ -1,23 +1,118 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Coglan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-02-25 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email: jcoglan@gmail.com
|
15
|
-
executables:
|
15
|
+
executables:
|
16
|
+
- jit
|
16
17
|
extensions: []
|
17
18
|
extra_rdoc_files: []
|
18
|
-
files:
|
19
|
-
|
20
|
-
|
19
|
+
files:
|
20
|
+
- LICENSE.txt
|
21
|
+
- bin/jit
|
22
|
+
- lib/color.rb
|
23
|
+
- lib/command.rb
|
24
|
+
- lib/command/add.rb
|
25
|
+
- lib/command/base.rb
|
26
|
+
- lib/command/branch.rb
|
27
|
+
- lib/command/checkout.rb
|
28
|
+
- lib/command/cherry_pick.rb
|
29
|
+
- lib/command/commit.rb
|
30
|
+
- lib/command/config.rb
|
31
|
+
- lib/command/diff.rb
|
32
|
+
- lib/command/fetch.rb
|
33
|
+
- lib/command/init.rb
|
34
|
+
- lib/command/log.rb
|
35
|
+
- lib/command/merge.rb
|
36
|
+
- lib/command/push.rb
|
37
|
+
- lib/command/receive_pack.rb
|
38
|
+
- lib/command/remote.rb
|
39
|
+
- lib/command/reset.rb
|
40
|
+
- lib/command/rev_list.rb
|
41
|
+
- lib/command/revert.rb
|
42
|
+
- lib/command/rm.rb
|
43
|
+
- lib/command/shared/fast_forward.rb
|
44
|
+
- lib/command/shared/print_diff.rb
|
45
|
+
- lib/command/shared/receive_objects.rb
|
46
|
+
- lib/command/shared/remote_agent.rb
|
47
|
+
- lib/command/shared/remote_client.rb
|
48
|
+
- lib/command/shared/send_objects.rb
|
49
|
+
- lib/command/shared/sequencing.rb
|
50
|
+
- lib/command/shared/write_commit.rb
|
51
|
+
- lib/command/status.rb
|
52
|
+
- lib/command/upload_pack.rb
|
53
|
+
- lib/config.rb
|
54
|
+
- lib/config/stack.rb
|
55
|
+
- lib/database.rb
|
56
|
+
- lib/database/author.rb
|
57
|
+
- lib/database/backends.rb
|
58
|
+
- lib/database/blob.rb
|
59
|
+
- lib/database/commit.rb
|
60
|
+
- lib/database/entry.rb
|
61
|
+
- lib/database/loose.rb
|
62
|
+
- lib/database/packed.rb
|
63
|
+
- lib/database/tree.rb
|
64
|
+
- lib/database/tree_diff.rb
|
65
|
+
- lib/diff.rb
|
66
|
+
- lib/diff/combined.rb
|
67
|
+
- lib/diff/hunk.rb
|
68
|
+
- lib/diff/myers.rb
|
69
|
+
- lib/editor.rb
|
70
|
+
- lib/index.rb
|
71
|
+
- lib/index/checksum.rb
|
72
|
+
- lib/index/entry.rb
|
73
|
+
- lib/lockfile.rb
|
74
|
+
- lib/merge/bases.rb
|
75
|
+
- lib/merge/common_ancestors.rb
|
76
|
+
- lib/merge/diff3.rb
|
77
|
+
- lib/merge/inputs.rb
|
78
|
+
- lib/merge/resolve.rb
|
79
|
+
- lib/pack.rb
|
80
|
+
- lib/pack/compressor.rb
|
81
|
+
- lib/pack/delta.rb
|
82
|
+
- lib/pack/entry.rb
|
83
|
+
- lib/pack/expander.rb
|
84
|
+
- lib/pack/index.rb
|
85
|
+
- lib/pack/indexer.rb
|
86
|
+
- lib/pack/numbers.rb
|
87
|
+
- lib/pack/reader.rb
|
88
|
+
- lib/pack/stream.rb
|
89
|
+
- lib/pack/unpacker.rb
|
90
|
+
- lib/pack/window.rb
|
91
|
+
- lib/pack/writer.rb
|
92
|
+
- lib/pack/xdelta.rb
|
93
|
+
- lib/pager.rb
|
94
|
+
- lib/progress.rb
|
95
|
+
- lib/refs.rb
|
96
|
+
- lib/remotes.rb
|
97
|
+
- lib/remotes/protocol.rb
|
98
|
+
- lib/remotes/refspec.rb
|
99
|
+
- lib/remotes/remote.rb
|
100
|
+
- lib/repository.rb
|
101
|
+
- lib/repository/divergence.rb
|
102
|
+
- lib/repository/hard_reset.rb
|
103
|
+
- lib/repository/inspector.rb
|
104
|
+
- lib/repository/migration.rb
|
105
|
+
- lib/repository/pending_commit.rb
|
106
|
+
- lib/repository/sequencer.rb
|
107
|
+
- lib/repository/status.rb
|
108
|
+
- lib/rev_list.rb
|
109
|
+
- lib/revision.rb
|
110
|
+
- lib/sorted_hash.rb
|
111
|
+
- lib/temp_file.rb
|
112
|
+
- lib/workspace.rb
|
113
|
+
homepage: https://shop.jcoglan.com/building-git/
|
114
|
+
licenses:
|
115
|
+
- GPL-3.0
|
21
116
|
metadata: {}
|
22
117
|
post_install_message:
|
23
118
|
rdoc_options: []
|
@@ -34,9 +129,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
34
129
|
- !ruby/object:Gem::Version
|
35
130
|
version: '0'
|
36
131
|
requirements: []
|
37
|
-
|
38
|
-
rubygems_version: 2.6.13
|
132
|
+
rubygems_version: 3.0.1
|
39
133
|
signing_key:
|
40
134
|
specification_version: 4
|
41
|
-
summary:
|
135
|
+
summary: The information manager from London
|
42
136
|
test_files: []
|