forked from libgit2/rugged
-
Notifications
You must be signed in to change notification settings - Fork 0
/
USAGE.rb
159 lines (129 loc) · 2.75 KB
/
USAGE.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#
# Some example proposed usages of Rugged
# so we can make sure the API design is OK
#
#
# low level reading and writing
#
repo = Rugged::Repository.new(path_to_repo)
if repo.exists(blob_oid)
# reading
blob_data, type = repo.read(blob_oid)
blob = repo.lookup(blob_oid)
puts blob.data
assert blob.data == blob_data && type == 'blob'
# writing
blob_data += "FU, SPIDERMAN 3"
new_oid = repo.write(blob_data, blob)
blob.data(blob_data)
assert !blob.written?
new_oid2 = blob.write
assert new_oid == new_oid2
assert blob.written?
end
#
# getting the contents of a blob with commit and path
#
commit = repo.lookup(commit_oid)
commit.tree.each do |entry|
if (entry.name == path)
&& (entry.type == 'blob')
return entry.gobect.data
end
end
#
# getting commit data from oid
#
commit = repo.lookup(commit_oid, 'commit')
puts "oid: " + commit.oid
puts commit.author.name
puts commit.author.email
puts commit.author.date.strftime("%y-%m-%d")
puts
puts commit.message
#
# listing a single level tree
#
commit = repo.lookup(commit_oid)
commit.tree.each do |entry|
puts entry.name
end
#
# git ls-tree -rt
#
def ls_tree(tree_oid)
tree = repo.lookup(tree_oid, 'tree')
tree.each do |entry|
puts [entry.mode, entry.oid, entry.name].join(' ')
if entry.type == 'tree'
ls_tree(entry.oid)
end
end
end
commit = repo.lookup(commit_oid)
ls_tree(tree_oid)
#
# updating a file and committing
#
commit = repo.lookup(head_oid)
tree = commit.tree
entry = tree.path("file.txt")
blob = entry.gobject
blob.data(blob.data + "EXTRA")
boid = blob.write
tree.add(entry.oid(boid))
toid = tree.write
new_commit = Rugged::Commit.new
person = Rugged::Person.new("Scott", "scott@github.com", Time.now)
commit.author(person)
commit.message("updated file.txt")
commit.parents([head_oid])
commit.tree(toid)
commit_oid = commit.write
repo.update_ref('refs/heads/master', commit_oid)
#
# git log
#
walker = repo.walker
walker.push(head_oid)
while oid = walker.next
commit = repo.lookup(oid)
puts [commit.oid[0, 8], commit.short_message].join(' ')
end
#
# git log --since=1.week.ago A ^B
#
since_time = Time.parse("1 week ago")
walker = repo.walker
walker.push(a_oid)
walker.hide(b_oid)
while oid = walker.next
commit = repo.lookup(oid)
if commit.author.date > since_time
walker.hide(oid)
else
puts [commit.oid[0, 8], commit.short_message].join(' ')
end
end
#
# git log --all
#
walker = repo.walker
repo.branches(:heads).each do |branch|
walker.push(branch.oid)
end
while oid = walker.next
...
end
#
# finding the last commit that touched a file
#
walker = repo.walker
walker.push(head_oid)
while oid = walker.next
commit = repo.lookup(oid)
diff = commit.diff_tree(commit.parents[0])
if diff.include?(path)
return commit.oid
end
end