rdavila-rugged 0.24.0b13
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 +7 -0
- data/LICENSE +21 -0
- data/README.md +619 -0
- data/ext/rugged/extconf.rb +105 -0
- data/ext/rugged/rugged.c +527 -0
- data/ext/rugged/rugged.h +185 -0
- data/ext/rugged/rugged_backend.c +34 -0
- data/ext/rugged/rugged_blame.c +292 -0
- data/ext/rugged/rugged_blob.c +638 -0
- data/ext/rugged/rugged_branch.c +195 -0
- data/ext/rugged/rugged_branch_collection.c +408 -0
- data/ext/rugged/rugged_commit.c +691 -0
- data/ext/rugged/rugged_config.c +404 -0
- data/ext/rugged/rugged_cred.c +148 -0
- data/ext/rugged/rugged_diff.c +686 -0
- data/ext/rugged/rugged_diff_delta.c +105 -0
- data/ext/rugged/rugged_diff_hunk.c +103 -0
- data/ext/rugged/rugged_diff_line.c +83 -0
- data/ext/rugged/rugged_index.c +1255 -0
- data/ext/rugged/rugged_note.c +376 -0
- data/ext/rugged/rugged_object.c +383 -0
- data/ext/rugged/rugged_patch.c +245 -0
- data/ext/rugged/rugged_reference.c +396 -0
- data/ext/rugged/rugged_reference_collection.c +446 -0
- data/ext/rugged/rugged_remote.c +691 -0
- data/ext/rugged/rugged_remote_collection.c +457 -0
- data/ext/rugged/rugged_repo.c +2669 -0
- data/ext/rugged/rugged_revwalk.c +495 -0
- data/ext/rugged/rugged_settings.c +155 -0
- data/ext/rugged/rugged_signature.c +106 -0
- data/ext/rugged/rugged_submodule.c +852 -0
- data/ext/rugged/rugged_submodule_collection.c +384 -0
- data/ext/rugged/rugged_tag.c +251 -0
- data/ext/rugged/rugged_tag_collection.c +347 -0
- data/ext/rugged/rugged_tree.c +919 -0
- data/lib/rugged.rb +23 -0
- data/lib/rugged/attributes.rb +41 -0
- data/lib/rugged/blob.rb +28 -0
- data/lib/rugged/branch.rb +19 -0
- data/lib/rugged/commit.rb +54 -0
- data/lib/rugged/console.rb +9 -0
- data/lib/rugged/credentials.rb +43 -0
- data/lib/rugged/diff.rb +20 -0
- data/lib/rugged/diff/delta.rb +53 -0
- data/lib/rugged/diff/hunk.rb +18 -0
- data/lib/rugged/diff/line.rb +47 -0
- data/lib/rugged/index.rb +13 -0
- data/lib/rugged/object.rb +7 -0
- data/lib/rugged/patch.rb +36 -0
- data/lib/rugged/reference.rb +7 -0
- data/lib/rugged/remote.rb +4 -0
- data/lib/rugged/repository.rb +227 -0
- data/lib/rugged/submodule_collection.rb +48 -0
- data/lib/rugged/tag.rb +50 -0
- data/lib/rugged/tree.rb +38 -0
- data/lib/rugged/version.rb +3 -0
- data/lib/rugged/walker.rb +5 -0
- metadata +146 -0
data/ext/rugged/rugged.h
ADDED
@@ -0,0 +1,185 @@
|
|
1
|
+
/*
|
2
|
+
* The MIT License
|
3
|
+
*
|
4
|
+
* Copyright (c) 2014 GitHub, Inc
|
5
|
+
*
|
6
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
|
+
* of this software and associated documentation files (the "Software"), to deal
|
8
|
+
* in the Software without restriction, including without limitation the rights
|
9
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
10
|
+
* copies of the Software, and to permit persons to whom the Software is
|
11
|
+
* furnished to do so, subject to the following conditions:
|
12
|
+
*
|
13
|
+
* The above copyright notice and this permission notice shall be included in
|
14
|
+
* all copies or substantial portions of the Software.
|
15
|
+
*
|
16
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
19
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
22
|
+
* THE SOFTWARE.
|
23
|
+
*/
|
24
|
+
|
25
|
+
#ifndef __H_RUGGED_BINDINGS__
|
26
|
+
#define __H_RUGGED_BINDINGS__
|
27
|
+
|
28
|
+
// tell rbx not to use it's caching compat layer
|
29
|
+
// by doing this we're making a promize to RBX that
|
30
|
+
// we'll never modify the pointers we get back from RSTRING_PTR
|
31
|
+
#define RSTRING_NOT_MODIFIED
|
32
|
+
|
33
|
+
#include <ruby.h>
|
34
|
+
#ifndef HAVE_RUBY_ENCODING_H
|
35
|
+
#error "Rugged requires Ruby 1.9+ to build"
|
36
|
+
#else
|
37
|
+
#include <ruby/encoding.h>
|
38
|
+
#endif
|
39
|
+
|
40
|
+
#include <assert.h>
|
41
|
+
#include <git2.h>
|
42
|
+
#include <git2/odb_backend.h>
|
43
|
+
|
44
|
+
#define rb_str_new_utf8(str) rb_enc_str_new(str, strlen(str), rb_utf8_encoding())
|
45
|
+
#define CSTR2SYM(s) (ID2SYM(rb_intern((s))))
|
46
|
+
|
47
|
+
/*
|
48
|
+
* Initialization functions
|
49
|
+
*/
|
50
|
+
void Init_rugged_object(void);
|
51
|
+
void Init_rugged_branch(void);
|
52
|
+
void Init_rugged_branch_collection(void);
|
53
|
+
void Init_rugged_commit(void);
|
54
|
+
void Init_rugged_tree(void);
|
55
|
+
void Init_rugged_tag(void);
|
56
|
+
void Init_rugged_tag_collection(void);
|
57
|
+
void Init_rugged_blob(void);
|
58
|
+
void Init_rugged_index(void);
|
59
|
+
void Init_rugged_repo(void);
|
60
|
+
void Init_rugged_revwalk(void);
|
61
|
+
void Init_rugged_reference(void);
|
62
|
+
void Init_rugged_reference_collection(void);
|
63
|
+
void Init_rugged_config(void);
|
64
|
+
void Init_rugged_remote(void);
|
65
|
+
void Init_rugged_remote_collection(void);
|
66
|
+
void Init_rugged_notes(void);
|
67
|
+
void Init_rugged_settings(void);
|
68
|
+
void Init_rugged_submodule(void);
|
69
|
+
void Init_rugged_submodule_collection(void);
|
70
|
+
void Init_rugged_diff(void);
|
71
|
+
void Init_rugged_patch(void);
|
72
|
+
void Init_rugged_diff_delta(void);
|
73
|
+
void Init_rugged_diff_hunk(void);
|
74
|
+
void Init_rugged_diff_line(void);
|
75
|
+
void Init_rugged_blame(void);
|
76
|
+
void Init_rugged_cred(void);
|
77
|
+
void Init_rugged_backend(void);
|
78
|
+
|
79
|
+
VALUE rb_git_object_init(git_otype type, int argc, VALUE *argv, VALUE self);
|
80
|
+
|
81
|
+
VALUE rugged_raw_read(git_repository *repo, const git_oid *oid);
|
82
|
+
|
83
|
+
VALUE rugged_signature_new(const git_signature *sig, const char *encoding_name);
|
84
|
+
|
85
|
+
VALUE rugged_repo_new(VALUE klass, git_repository *repo);
|
86
|
+
VALUE rugged_index_new(VALUE klass, VALUE owner, git_index *index);
|
87
|
+
VALUE rugged_config_new(VALUE klass, VALUE owner, git_config *cfg);
|
88
|
+
VALUE rugged_object_new(VALUE owner, git_object *object);
|
89
|
+
VALUE rugged_object_rev_parse(VALUE rb_repo, VALUE rb_spec, int as_obj);
|
90
|
+
VALUE rugged_ref_new(VALUE klass, VALUE owner, git_reference *ref);
|
91
|
+
VALUE rugged_diff_new(VALUE klass, VALUE owner, git_diff *diff);
|
92
|
+
VALUE rugged_patch_new(VALUE owner, git_patch *patch);
|
93
|
+
VALUE rugged_diff_delta_new(VALUE owner, const git_diff_delta *delta);
|
94
|
+
VALUE rugged_diff_hunk_new(VALUE owner, size_t hunk_idx, const git_diff_hunk *hunk, size_t lines_in_hunk);
|
95
|
+
VALUE rugged_diff_line_new(const git_diff_line *line);
|
96
|
+
VALUE rugged_remote_new(VALUE owner, git_remote *remote);
|
97
|
+
VALUE rb_git_delta_file_fromC(const git_diff_file *file);
|
98
|
+
|
99
|
+
void rugged_parse_diff_options(git_diff_options *opts, VALUE rb_options);
|
100
|
+
void rugged_parse_merge_options(git_merge_options *opts, VALUE rb_options);
|
101
|
+
|
102
|
+
void rugged_cred_extract(git_cred **cred, int allowed_types, VALUE rb_credential);
|
103
|
+
|
104
|
+
VALUE rugged_otype_new(git_otype t);
|
105
|
+
git_otype rugged_otype_get(VALUE rb_type);
|
106
|
+
|
107
|
+
git_signature *rugged_signature_get(VALUE rb_person, git_repository *repo);
|
108
|
+
git_object *rugged_object_get(git_repository *repo, VALUE object_value, git_otype type);
|
109
|
+
int rugged_oid_get(git_oid *oid, git_repository *repo, VALUE p);
|
110
|
+
|
111
|
+
void rugged_rb_ary_to_strarray(VALUE rb_array, git_strarray *str_array);
|
112
|
+
VALUE rugged_strarray_to_rb_ary(git_strarray *str_array);
|
113
|
+
|
114
|
+
static inline void rugged_set_owner(VALUE object, VALUE owner)
|
115
|
+
{
|
116
|
+
rb_iv_set(object, "@owner", owner);
|
117
|
+
}
|
118
|
+
|
119
|
+
static inline VALUE rugged_owner(VALUE object)
|
120
|
+
{
|
121
|
+
return rb_iv_get(object, "@owner");
|
122
|
+
}
|
123
|
+
|
124
|
+
extern void rugged_exception_raise(void);
|
125
|
+
|
126
|
+
static inline void rugged_exception_check(int errorcode)
|
127
|
+
{
|
128
|
+
if (errorcode < 0)
|
129
|
+
rugged_exception_raise();
|
130
|
+
}
|
131
|
+
|
132
|
+
static inline int rugged_parse_bool(VALUE boolean)
|
133
|
+
{
|
134
|
+
if (TYPE(boolean) != T_TRUE && TYPE(boolean) != T_FALSE)
|
135
|
+
rb_raise(rb_eTypeError, "Expected boolean value");
|
136
|
+
|
137
|
+
return boolean ? 1 : 0;
|
138
|
+
}
|
139
|
+
|
140
|
+
extern VALUE rb_cRuggedRepo;
|
141
|
+
|
142
|
+
VALUE rugged__block_yield_splat(VALUE args);
|
143
|
+
|
144
|
+
struct rugged_cb_payload
|
145
|
+
{
|
146
|
+
VALUE rb_data;
|
147
|
+
int exception;
|
148
|
+
};
|
149
|
+
|
150
|
+
struct rugged_remote_cb_payload
|
151
|
+
{
|
152
|
+
VALUE progress;
|
153
|
+
VALUE completion;
|
154
|
+
VALUE transfer_progress;
|
155
|
+
VALUE update_tips;
|
156
|
+
VALUE credentials;
|
157
|
+
VALUE result;
|
158
|
+
int exception;
|
159
|
+
};
|
160
|
+
|
161
|
+
void rugged_remote_init_callbacks_and_payload_from_options(
|
162
|
+
VALUE rb_options,
|
163
|
+
git_remote_callbacks *callbacks,
|
164
|
+
struct rugged_remote_cb_payload *payload);
|
165
|
+
|
166
|
+
static inline void rugged_check_repo(VALUE rb_repo)
|
167
|
+
{
|
168
|
+
if (!rb_obj_is_kind_of(rb_repo, rb_cRuggedRepo))
|
169
|
+
rb_raise(rb_eTypeError, "Expecting a Rugged Repository");
|
170
|
+
}
|
171
|
+
|
172
|
+
static inline VALUE rugged_create_oid(const git_oid *oid)
|
173
|
+
{
|
174
|
+
char out[40];
|
175
|
+
git_oid_fmt(out, oid);
|
176
|
+
return rb_str_new(out, 40);
|
177
|
+
}
|
178
|
+
|
179
|
+
|
180
|
+
typedef struct _rugged_backend {
|
181
|
+
int (* odb_backend)(git_odb_backend **backend_out, struct _rugged_backend *backend, const char* path);
|
182
|
+
int (* refdb_backend)(git_refdb_backend **backend_out, struct _rugged_backend *backend, const char* path);
|
183
|
+
} rugged_backend;
|
184
|
+
|
185
|
+
#endif
|
@@ -0,0 +1,34 @@
|
|
1
|
+
/*
|
2
|
+
* The MIT License
|
3
|
+
*
|
4
|
+
* Copyright (c) 2014 GitHub, Inc
|
5
|
+
*
|
6
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
|
+
* of this software and associated documentation files (the "Software"), to deal
|
8
|
+
* in the Software without restriction, including without limitation the rights
|
9
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
10
|
+
* copies of the Software, and to permit persons to whom the Software is
|
11
|
+
* furnished to do so, subject to the following conditions:
|
12
|
+
*
|
13
|
+
* The above copyright notice and this permission notice shall be included in
|
14
|
+
* all copies or substantial portions of the Software.
|
15
|
+
*
|
16
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
19
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
22
|
+
* THE SOFTWARE.
|
23
|
+
*/
|
24
|
+
|
25
|
+
#include "rugged.h"
|
26
|
+
|
27
|
+
extern VALUE rb_mRugged;
|
28
|
+
|
29
|
+
VALUE rb_cRuggedBackend;
|
30
|
+
|
31
|
+
void Init_rugged_backend(void)
|
32
|
+
{
|
33
|
+
rb_cRuggedBackend = rb_define_class_under(rb_mRugged, "Backend", rb_cObject);
|
34
|
+
}
|
@@ -0,0 +1,292 @@
|
|
1
|
+
/*
|
2
|
+
* The MIT License
|
3
|
+
*
|
4
|
+
* Copyright (c) 2014 GitHub, Inc
|
5
|
+
*
|
6
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
|
+
* of this software and associated documentation files (the "Software"), to deal
|
8
|
+
* in the Software without restriction, including without limitation the rights
|
9
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
10
|
+
* copies of the Software, and to permit persons to whom the Software is
|
11
|
+
* furnished to do so, subject to the following conditions:
|
12
|
+
*
|
13
|
+
* The above copyright notice and this permission notice shall be included in
|
14
|
+
* all copies or substantial portions of the Software.
|
15
|
+
*
|
16
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
19
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
22
|
+
* THE SOFTWARE.
|
23
|
+
*/
|
24
|
+
|
25
|
+
#include "rugged.h"
|
26
|
+
|
27
|
+
extern VALUE rb_mRugged;
|
28
|
+
VALUE rb_cRuggedBlame;
|
29
|
+
|
30
|
+
static VALUE rb_git_blame_hunk_fromC(const git_blame_hunk *hunk)
|
31
|
+
{
|
32
|
+
VALUE rb_hunk;
|
33
|
+
if (!hunk) {
|
34
|
+
return Qnil;
|
35
|
+
}
|
36
|
+
|
37
|
+
rb_hunk = rb_hash_new();
|
38
|
+
rb_hash_aset(rb_hunk, CSTR2SYM("lines_in_hunk"), UINT2NUM(hunk->lines_in_hunk));
|
39
|
+
|
40
|
+
rb_hash_aset(rb_hunk, CSTR2SYM("final_commit_id"), rugged_create_oid(&(hunk->final_commit_id)));
|
41
|
+
rb_hash_aset(rb_hunk, CSTR2SYM("final_start_line_number"), UINT2NUM(hunk->final_start_line_number));
|
42
|
+
rb_hash_aset(rb_hunk, CSTR2SYM("final_signature"), hunk->final_signature ? rugged_signature_new(hunk->final_signature, NULL) : Qnil);
|
43
|
+
|
44
|
+
rb_hash_aset(rb_hunk, CSTR2SYM("orig_commit_id"), rugged_create_oid(&(hunk->orig_commit_id)));
|
45
|
+
rb_hash_aset(rb_hunk, CSTR2SYM("orig_path"), hunk->orig_path ? rb_str_new2(hunk->orig_path) : Qnil);
|
46
|
+
rb_hash_aset(rb_hunk, CSTR2SYM("orig_start_line_number"), UINT2NUM(hunk->orig_start_line_number));
|
47
|
+
rb_hash_aset(rb_hunk, CSTR2SYM("orig_signature"), hunk->orig_signature ? rugged_signature_new(hunk->orig_signature, NULL) : Qnil);
|
48
|
+
|
49
|
+
rb_hash_aset(rb_hunk, CSTR2SYM("boundary"), hunk->boundary ? Qtrue : Qfalse);
|
50
|
+
|
51
|
+
return rb_hunk;
|
52
|
+
}
|
53
|
+
|
54
|
+
static void rugged_parse_blame_options(git_blame_options *opts, git_repository *repo, VALUE rb_options)
|
55
|
+
{
|
56
|
+
if (!NIL_P(rb_options)) {
|
57
|
+
VALUE rb_value;
|
58
|
+
Check_Type(rb_options, T_HASH);
|
59
|
+
|
60
|
+
rb_value = rb_hash_aref(rb_options, CSTR2SYM("min_line"));
|
61
|
+
if (!NIL_P(rb_value)) {
|
62
|
+
Check_Type(rb_value, T_FIXNUM);
|
63
|
+
opts->min_line = FIX2UINT(rb_value);
|
64
|
+
}
|
65
|
+
|
66
|
+
rb_value = rb_hash_aref(rb_options, CSTR2SYM("max_line"));
|
67
|
+
if (!NIL_P(rb_value)) {
|
68
|
+
Check_Type(rb_value, T_FIXNUM);
|
69
|
+
opts->max_line = FIX2UINT(rb_value);
|
70
|
+
}
|
71
|
+
|
72
|
+
rb_value = rb_hash_aref(rb_options, CSTR2SYM("newest_commit"));
|
73
|
+
if (!NIL_P(rb_value)) {
|
74
|
+
int error = rugged_oid_get(&opts->newest_commit, repo, rb_value);
|
75
|
+
rugged_exception_check(error);
|
76
|
+
}
|
77
|
+
|
78
|
+
rb_value = rb_hash_aref(rb_options, CSTR2SYM("oldest_commit"));
|
79
|
+
if (!NIL_P(rb_value)) {
|
80
|
+
int error = rugged_oid_get(&opts->oldest_commit, repo, rb_value);
|
81
|
+
rugged_exception_check(error);
|
82
|
+
}
|
83
|
+
|
84
|
+
if (RTEST(rb_hash_aref(rb_options, CSTR2SYM("track_copies_same_file")))) {
|
85
|
+
opts->flags |= GIT_BLAME_TRACK_COPIES_SAME_FILE;
|
86
|
+
}
|
87
|
+
|
88
|
+
if (RTEST(rb_hash_aref(rb_options, CSTR2SYM("track_copies_same_commit_moves")))) {
|
89
|
+
opts->flags |= GIT_BLAME_TRACK_COPIES_SAME_COMMIT_MOVES;
|
90
|
+
}
|
91
|
+
|
92
|
+
if (RTEST(rb_hash_aref(rb_options, CSTR2SYM("track_copies_same_commit_copies")))) {
|
93
|
+
opts->flags |= GIT_BLAME_TRACK_COPIES_SAME_COMMIT_COPIES;
|
94
|
+
}
|
95
|
+
|
96
|
+
if (RTEST(rb_hash_aref(rb_options, CSTR2SYM("track_copies_any_commit_copies")))) {
|
97
|
+
opts->flags |= GIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES;
|
98
|
+
}
|
99
|
+
}
|
100
|
+
}
|
101
|
+
|
102
|
+
/*
|
103
|
+
* call-seq:
|
104
|
+
* Blame.new(repo, path, options = {}) -> blame
|
105
|
+
*
|
106
|
+
* Get blame data for the file at +path+ in +repo+.
|
107
|
+
*
|
108
|
+
* The following options can be passed in the +options+ Hash:
|
109
|
+
*
|
110
|
+
* :newest_commit ::
|
111
|
+
* The ID of the newest commit to consider in the blame. Defaults to +HEAD+.
|
112
|
+
* This can either be a Rugged::Object instance, or a full or abbreviated
|
113
|
+
* SHA1 id.
|
114
|
+
*
|
115
|
+
* :oldest_commit ::
|
116
|
+
* The id of the oldest commit to consider. Defaults to the first commit
|
117
|
+
* encountered with a NULL parent. This can either be a Rugged::Object
|
118
|
+
* instance, or a full or abbreviated SHA1 id.
|
119
|
+
*
|
120
|
+
* :min_line ::
|
121
|
+
* The first line in the file to blame. Line numbers start with 1.
|
122
|
+
* Defaults to +1+.
|
123
|
+
*
|
124
|
+
* :max_line ::
|
125
|
+
* The last line in the file to blame. Defaults to the last line in
|
126
|
+
* the file.
|
127
|
+
*
|
128
|
+
* :track_copies_same_file
|
129
|
+
* If this value is +true+, lines that have moved within a file will be
|
130
|
+
* tracked (like `git blame -M`).
|
131
|
+
*
|
132
|
+
* :track_copies_same_commit_moves
|
133
|
+
* If this value is +true+, lines that have moved across files in the same
|
134
|
+
* commit will be tracked (like `git blame -C`).
|
135
|
+
*
|
136
|
+
* :track_copies_same_commit_copies
|
137
|
+
* If this value is +true+, lines that have been copied from another file
|
138
|
+
* that exists in the same commit will be tracked (like `git blame -CC`).
|
139
|
+
*
|
140
|
+
* :track_copies_any_commit_copies
|
141
|
+
* If this value is +true+, lines that have been copied from another file
|
142
|
+
* that exists in *any* commit will be tracked (like `git blame -CCC`).
|
143
|
+
*
|
144
|
+
*/
|
145
|
+
static VALUE rb_git_blame_new(int argc, VALUE *argv, VALUE klass)
|
146
|
+
{
|
147
|
+
VALUE rb_repo, rb_path, rb_options;
|
148
|
+
git_repository *repo;
|
149
|
+
git_blame *blame;
|
150
|
+
git_blame_options opts = GIT_BLAME_OPTIONS_INIT;
|
151
|
+
|
152
|
+
rb_scan_args(argc, argv, "20:", &rb_repo, &rb_path, &rb_options);
|
153
|
+
|
154
|
+
rugged_check_repo(rb_repo);
|
155
|
+
Data_Get_Struct(rb_repo, git_repository, repo);
|
156
|
+
|
157
|
+
Check_Type(rb_path, T_STRING);
|
158
|
+
|
159
|
+
rugged_parse_blame_options(&opts, repo, rb_options);
|
160
|
+
|
161
|
+
rugged_exception_check(git_blame_file(
|
162
|
+
&blame, repo, StringValueCStr(rb_path), &opts
|
163
|
+
));
|
164
|
+
|
165
|
+
return Data_Wrap_Struct(klass, NULL, &git_blame_free, blame);
|
166
|
+
}
|
167
|
+
|
168
|
+
/*
|
169
|
+
* call-seq:
|
170
|
+
* blame.for_line(line_no) -> hunk
|
171
|
+
*
|
172
|
+
* Returns the blame hunk data for the given +line_no+ in +blame+.
|
173
|
+
* Line number counting starts with +1+.
|
174
|
+
*/
|
175
|
+
static VALUE rb_git_blame_for_line(VALUE self, VALUE rb_line_no)
|
176
|
+
{
|
177
|
+
git_blame *blame;
|
178
|
+
int line_no;
|
179
|
+
|
180
|
+
Data_Get_Struct(self, git_blame, blame);
|
181
|
+
Check_Type(rb_line_no, T_FIXNUM);
|
182
|
+
|
183
|
+
line_no = NUM2INT(rb_line_no);
|
184
|
+
|
185
|
+
if (line_no < 0) {
|
186
|
+
rb_raise(rb_eArgError, "line number can't be negative");
|
187
|
+
}
|
188
|
+
|
189
|
+
return rb_git_blame_hunk_fromC(
|
190
|
+
git_blame_get_hunk_byline(blame, (uint32_t)line_no)
|
191
|
+
);
|
192
|
+
}
|
193
|
+
|
194
|
+
/*
|
195
|
+
* call-seq:
|
196
|
+
* blame.count -> count
|
197
|
+
* blame.size -> count
|
198
|
+
*
|
199
|
+
* Returns the total +count+ of blame hunks in +blame+.
|
200
|
+
*/
|
201
|
+
static VALUE rb_git_blame_count(VALUE self)
|
202
|
+
{
|
203
|
+
git_blame *blame;
|
204
|
+
Data_Get_Struct(self, git_blame, blame);
|
205
|
+
return UINT2NUM(git_blame_get_hunk_count(blame));
|
206
|
+
}
|
207
|
+
|
208
|
+
/*
|
209
|
+
* call-seq:
|
210
|
+
* blame[index] -> hunk
|
211
|
+
*
|
212
|
+
* Returns the blame hunk data at the given +index+ in +blame+.
|
213
|
+
*
|
214
|
+
* Negative indices count backward from the end of the blame hunks (-1 is the last
|
215
|
+
* element).
|
216
|
+
*
|
217
|
+
* Returns +nil+ if no blame hunk exists at the given +index+.
|
218
|
+
*/
|
219
|
+
static VALUE rb_git_blame_get_by_index(VALUE self, VALUE rb_index)
|
220
|
+
{
|
221
|
+
git_blame *blame;
|
222
|
+
int index;
|
223
|
+
uint32_t blame_count;
|
224
|
+
|
225
|
+
Data_Get_Struct(self, git_blame, blame);
|
226
|
+
Check_Type(rb_index, T_FIXNUM);
|
227
|
+
|
228
|
+
index = NUM2INT(rb_index);
|
229
|
+
blame_count = git_blame_get_hunk_count(blame);
|
230
|
+
|
231
|
+
if (index < 0) {
|
232
|
+
if ((uint32_t)(-index) > blame_count) {
|
233
|
+
return Qnil;
|
234
|
+
}
|
235
|
+
|
236
|
+
return rb_git_blame_hunk_fromC(
|
237
|
+
git_blame_get_hunk_byindex(blame, (uint32_t)(blame_count + index))
|
238
|
+
);
|
239
|
+
}
|
240
|
+
|
241
|
+
if ((uint32_t)index > blame_count)
|
242
|
+
return Qnil;
|
243
|
+
|
244
|
+
return rb_git_blame_hunk_fromC(
|
245
|
+
git_blame_get_hunk_byindex(blame, (uint32_t)index)
|
246
|
+
);
|
247
|
+
}
|
248
|
+
|
249
|
+
/*
|
250
|
+
* call-seq:
|
251
|
+
* blame.each { |hunk| ... } -> blame
|
252
|
+
* blame.each -> enumerator
|
253
|
+
*
|
254
|
+
* If given a block, yields each +hunk+ that is part of +blame+.
|
255
|
+
* If no block is given, an enumerator will be returned.
|
256
|
+
*/
|
257
|
+
static VALUE rb_git_blame_each(VALUE self)
|
258
|
+
{
|
259
|
+
git_blame *blame;
|
260
|
+
uint32_t i, blame_count;
|
261
|
+
|
262
|
+
if (!rb_block_given_p()) {
|
263
|
+
return rb_funcall(self, rb_intern("to_enum"), 1, CSTR2SYM("each"), self);
|
264
|
+
}
|
265
|
+
|
266
|
+
Data_Get_Struct(self, git_blame, blame);
|
267
|
+
|
268
|
+
blame_count = git_blame_get_hunk_count(blame);
|
269
|
+
for (i = 0; i < blame_count; ++i) {
|
270
|
+
rb_yield(rb_git_blame_hunk_fromC(
|
271
|
+
git_blame_get_hunk_byindex(blame, i)
|
272
|
+
));
|
273
|
+
}
|
274
|
+
|
275
|
+
return self;
|
276
|
+
}
|
277
|
+
|
278
|
+
void Init_rugged_blame(void)
|
279
|
+
{
|
280
|
+
rb_cRuggedBlame = rb_define_class_under(rb_mRugged, "Blame", rb_cObject);
|
281
|
+
rb_include_module(rb_cRuggedBlame, rb_mEnumerable);
|
282
|
+
|
283
|
+
rb_define_singleton_method(rb_cRuggedBlame, "new", rb_git_blame_new, -1);
|
284
|
+
|
285
|
+
rb_define_method(rb_cRuggedBlame, "[]", rb_git_blame_get_by_index, 1);
|
286
|
+
rb_define_method(rb_cRuggedBlame, "for_line", rb_git_blame_for_line, 1);
|
287
|
+
|
288
|
+
rb_define_method(rb_cRuggedBlame, "count", rb_git_blame_count, 0);
|
289
|
+
rb_define_method(rb_cRuggedBlame, "size", rb_git_blame_count, 0);
|
290
|
+
|
291
|
+
rb_define_method(rb_cRuggedBlame, "each", rb_git_blame_each, 0);
|
292
|
+
}
|