rugged 0.22.0b5 → 0.22.1b1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +19 -3
- data/ext/rugged/extconf.rb +21 -5
- data/ext/rugged/rugged.c +1 -0
- data/ext/rugged/rugged.h +8 -0
- data/ext/rugged/rugged_backend.c +34 -0
- data/ext/rugged/rugged_branch_collection.c +1 -0
- data/ext/rugged/rugged_remote.c +37 -86
- data/ext/rugged/rugged_remote_collection.c +2 -1
- data/ext/rugged/rugged_repo.c +149 -24
- data/ext/rugged/rugged_revwalk.c +1 -2
- data/ext/rugged/rugged_submodule.c +1 -1
- data/ext/rugged/rugged_tree.c +69 -5
- data/lib/rugged/version.rb +1 -1
- data/vendor/libgit2/CMakeLists.txt +2 -1
- data/vendor/libgit2/include/git2.h +0 -1
- data/vendor/libgit2/include/git2/checkout.h +8 -0
- data/vendor/libgit2/include/git2/merge.h +8 -0
- data/vendor/libgit2/include/git2/push.h +0 -110
- data/vendor/libgit2/include/git2/remote.h +30 -1
- data/vendor/libgit2/include/git2/revert.h +1 -1
- data/vendor/libgit2/include/git2/submodule.h +80 -1
- data/vendor/libgit2/include/git2/sys/index.h +2 -2
- data/vendor/libgit2/include/git2/{threads.h → sys/openssl.h} +10 -12
- data/vendor/libgit2/include/git2/sys/refs.h +11 -0
- data/vendor/libgit2/include/git2/tree.h +1 -1
- data/vendor/libgit2/include/git2/version.h +3 -3
- data/vendor/libgit2/src/attr_file.c +3 -1
- data/vendor/libgit2/src/buffer.c +2 -1
- data/vendor/libgit2/src/checkout.c +135 -39
- data/vendor/libgit2/src/checkout.h +7 -0
- data/vendor/libgit2/src/config_file.c +5 -7
- data/vendor/libgit2/src/crlf.c +2 -0
- data/vendor/libgit2/src/describe.c +6 -2
- data/vendor/libgit2/src/diff.c +1 -0
- data/vendor/libgit2/src/fileops.c +87 -19
- data/vendor/libgit2/src/fileops.h +18 -0
- data/vendor/libgit2/src/global.c +1 -1
- data/vendor/libgit2/src/ident.c +2 -0
- data/vendor/libgit2/src/index.c +4 -4
- data/vendor/libgit2/src/merge.c +3 -1
- data/vendor/libgit2/src/notes.c +1 -1
- data/vendor/libgit2/src/pack.c +1 -0
- data/vendor/libgit2/src/path.c +17 -12
- data/vendor/libgit2/src/path.h +17 -3
- data/vendor/libgit2/src/push.h +110 -0
- data/vendor/libgit2/src/rebase.c +4 -2
- data/vendor/libgit2/src/remote.c +237 -16
- data/vendor/libgit2/src/remote.h +2 -0
- data/vendor/libgit2/src/repository.c +7 -3
- data/vendor/libgit2/src/submodule.c +229 -18
- data/vendor/libgit2/src/transports/local.c +61 -2
- data/vendor/libgit2/src/transports/smart_protocol.c +5 -3
- data/vendor/libgit2/src/tree.c +2 -2
- data/vendor/libgit2/src/util.h +13 -2
- data/vendor/libgit2/src/win32/mingw-compat.h +2 -0
- data/vendor/libgit2/src/win32/path_w32.h +2 -0
- metadata +4 -4
- data/vendor/libgit2/cmake/Modules/FindLIBSSH2.cmake +0 -44
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a920e7f6ad886a0730f1b80b91990956469eb3c8
|
4
|
+
data.tar.gz: bc69152690eeea81ab3f2e0749a967de27b3107c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f26e34ae5df319b467d5348039255f0d4e1c8d885b6d11ec65511664b1e2a1d468369305dd383ab8084bc8566f12ab95caa2cade4698f9742d0d69ffff338323
|
7
|
+
data.tar.gz: e38f35f6abf4d6f08797c966c7e3a40508b771ed3f29c72e1dac56f4787c981ff9848a25142ff057924a2a53d139f22f33fa84f0b0e4a546951697e0c6917330
|
data/README.md
CHANGED
@@ -27,7 +27,7 @@ If you want to build Rugged with HTTPS and SSH support, check out the list of op
|
|
27
27
|
If you're using bundler and want to bundle `libgit2` with Rugged, you can use the `:submodules` option:
|
28
28
|
|
29
29
|
```ruby
|
30
|
-
gem 'rugged', git: 'git://github.com/libgit2/rugged.git',
|
30
|
+
gem 'rugged', git: 'git://github.com/libgit2/rugged.git', submodules: true
|
31
31
|
```
|
32
32
|
|
33
33
|
To load Rugged, you'll usually want to add something like this:
|
@@ -267,11 +267,11 @@ You can also write trees with the `TreeBuilder`:
|
|
267
267
|
|
268
268
|
```ruby
|
269
269
|
oid = repo.write("This is a blob.", :blob)
|
270
|
-
builder = Rugged::Tree::Builder.new
|
270
|
+
builder = Rugged::Tree::Builder.new(repo)
|
271
271
|
builder << { :type => :blob, :name => "README.md", :oid => oid, :filemode => 0100644 }
|
272
272
|
|
273
273
|
options = {}
|
274
|
-
options[:tree] = builder.write
|
274
|
+
options[:tree] = builder.write
|
275
275
|
|
276
276
|
options[:author] = { :email => "testuser@github.com", :name => 'Test Author', :time => Time.now }
|
277
277
|
options[:committer] = { :email => "testuser@github.com", :name => 'Test Author', :time => Time.now }
|
@@ -569,6 +569,22 @@ Rugged.raw_to_hex("\277\336Y\315\320\337\254\035\211(\024\366j\225d\032\275\212\
|
|
569
569
|
|
570
570
|
---
|
571
571
|
|
572
|
+
### Alternative backends
|
573
|
+
|
574
|
+
You can store bare repositories in alternative backends instead of storing on disk. (see
|
575
|
+
`redbadger/rugged-redis` for an example of how a rugged backend works).
|
576
|
+
|
577
|
+
```ruby
|
578
|
+
a_backend = Rugged::InMemory::Backend.new(opt1: 'setting', opt2: 'setting')
|
579
|
+
|
580
|
+
repo = Rugged::Repository.init_at('repo_name', :bare, backend: a_backend)
|
581
|
+
|
582
|
+
# or
|
583
|
+
|
584
|
+
repo = Rugged::Repository.bare('repo_name', backend: a_backend)
|
585
|
+
```
|
586
|
+
---
|
587
|
+
|
572
588
|
## Contributing
|
573
589
|
|
574
590
|
Fork libgit2/rugged on GitHub, make it awesomer (preferably in a branch named
|
data/ext/rugged/extconf.rb
CHANGED
@@ -19,15 +19,34 @@ if !(MAKE = find_executable('gmake') || find_executable('make'))
|
|
19
19
|
abort "ERROR: GNU make is required to build Rugged."
|
20
20
|
end
|
21
21
|
|
22
|
+
CWD = File.expand_path(File.dirname(__FILE__))
|
23
|
+
LIBGIT2_DIR = File.join(CWD, '..', '..', 'vendor', 'libgit2')
|
24
|
+
|
22
25
|
if arg_config("--use-system-libraries", !!ENV['RUGGED_USE_SYSTEM_LIBRARIES'])
|
23
26
|
puts "Building Rugged using system libraries.\n"
|
24
27
|
|
25
28
|
dir_config('git2').any? or pkg_config('libgit2')
|
26
29
|
|
27
|
-
|
30
|
+
major = minor = nil
|
31
|
+
|
32
|
+
File.readlines(File.join(LIBGIT2_DIR, "include", "git2", "version.h")).each do |line|
|
33
|
+
if !major && (matches = line.match(/^#define LIBGIT2_VER_MAJOR ([0-9]+)$/))
|
34
|
+
major = matches[1]
|
35
|
+
next
|
36
|
+
end
|
37
|
+
|
38
|
+
if !minor && (matches = line.match(/^#define LIBGIT2_VER_MINOR ([0-9]+)$/))
|
39
|
+
minor = matches[1]
|
40
|
+
next
|
41
|
+
end
|
42
|
+
|
43
|
+
break if major && minor
|
44
|
+
end
|
45
|
+
|
46
|
+
try_compile(<<-SRC) or abort "libgit2 version is not compatible, expected ~> #{major}.#{minor}.0"
|
28
47
|
#include <git2/version.h>
|
29
48
|
|
30
|
-
#if
|
49
|
+
#if LIBGIT2_VER_MAJOR != #{major} || LIBGIT2_VER_MINOR != #{minor}
|
31
50
|
#error libgit2 version is not compatible
|
32
51
|
#endif
|
33
52
|
SRC
|
@@ -40,9 +59,6 @@ else
|
|
40
59
|
abort "ERROR: pkg-config is required to build Rugged."
|
41
60
|
end
|
42
61
|
|
43
|
-
CWD = File.expand_path(File.dirname(__FILE__))
|
44
|
-
LIBGIT2_DIR = File.join(CWD, '..', '..', 'vendor', 'libgit2')
|
45
|
-
|
46
62
|
Dir.chdir(LIBGIT2_DIR) do
|
47
63
|
Dir.mkdir("build") if !Dir.exists?("build")
|
48
64
|
|
data/ext/rugged/rugged.c
CHANGED
data/ext/rugged/rugged.h
CHANGED
@@ -74,6 +74,7 @@ void Init_rugged_diff_hunk(void);
|
|
74
74
|
void Init_rugged_diff_line(void);
|
75
75
|
void Init_rugged_blame(void);
|
76
76
|
void Init_rugged_cred(void);
|
77
|
+
void Init_rugged_backend(void);
|
77
78
|
|
78
79
|
VALUE rb_git_object_init(git_otype type, int argc, VALUE *argv, VALUE self);
|
79
80
|
|
@@ -153,6 +154,7 @@ struct rugged_remote_cb_payload
|
|
153
154
|
VALUE transfer_progress;
|
154
155
|
VALUE update_tips;
|
155
156
|
VALUE credentials;
|
157
|
+
VALUE result;
|
156
158
|
int exception;
|
157
159
|
};
|
158
160
|
|
@@ -174,4 +176,10 @@ static inline VALUE rugged_create_oid(const git_oid *oid)
|
|
174
176
|
return rb_str_new(out, 40);
|
175
177
|
}
|
176
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
|
+
|
177
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
|
+
}
|
@@ -235,6 +235,7 @@ static VALUE each_branch(int argc, VALUE *argv, VALUE self, int branch_names_onl
|
|
235
235
|
Data_Get_Struct(rb_repo, git_repository, repo);
|
236
236
|
|
237
237
|
error = git_branch_iterator_new(&iter, repo, filter);
|
238
|
+
rugged_exception_check(error);
|
238
239
|
|
239
240
|
if (branch_names_only) {
|
240
241
|
git_reference *branch;
|
data/ext/rugged/rugged_remote.c
CHANGED
@@ -29,7 +29,7 @@ extern VALUE rb_cRuggedRepo;
|
|
29
29
|
extern VALUE rb_eRuggedError;
|
30
30
|
VALUE rb_cRuggedRemote;
|
31
31
|
|
32
|
-
#define RUGGED_REMOTE_CALLBACKS_INIT {1, progress_cb, NULL, credentials_cb, NULL, transfer_progress_cb, update_tips_cb, NULL}
|
32
|
+
#define RUGGED_REMOTE_CALLBACKS_INIT {1, progress_cb, NULL, credentials_cb, NULL, transfer_progress_cb, update_tips_cb, NULL, NULL, push_update_reference_cb, NULL}
|
33
33
|
|
34
34
|
static int progress_cb(const char *str, int len, void *data)
|
35
35
|
{
|
@@ -69,6 +69,15 @@ static int transfer_progress_cb(const git_transfer_progress *stats, void *data)
|
|
69
69
|
return payload->exception ? GIT_ERROR : GIT_OK;
|
70
70
|
}
|
71
71
|
|
72
|
+
static int push_update_reference_cb(const char *refname, const char *status, void *data) {
|
73
|
+
struct rugged_remote_cb_payload *payload = data;
|
74
|
+
|
75
|
+
if (status != NULL)
|
76
|
+
rb_hash_aset(payload->result, rb_str_new_utf8(refname), rb_str_new_utf8(status));
|
77
|
+
|
78
|
+
return GIT_OK;
|
79
|
+
}
|
80
|
+
|
72
81
|
static int update_tips_cb(const char *refname, const git_oid *src, const git_oid *dest, void *data)
|
73
82
|
{
|
74
83
|
struct rugged_remote_cb_payload *payload = data;
|
@@ -164,10 +173,12 @@ void rugged_remote_init_callbacks_and_payload_from_options(
|
|
164
173
|
prefilled.payload = payload;
|
165
174
|
memcpy(callbacks, &prefilled, sizeof(git_remote_callbacks));
|
166
175
|
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
176
|
+
if (!NIL_P(rb_options)) {
|
177
|
+
CALLABLE_OR_RAISE(payload->update_tips, rb_options, "update_tips");
|
178
|
+
CALLABLE_OR_RAISE(payload->progress, rb_options, "progress");
|
179
|
+
CALLABLE_OR_RAISE(payload->transfer_progress, rb_options, "transfer_progress");
|
180
|
+
CALLABLE_OR_RAISE(payload->credentials, rb_options, "credentials");
|
181
|
+
}
|
171
182
|
}
|
172
183
|
|
173
184
|
static void rb_git_remote__free(git_remote *remote)
|
@@ -237,7 +248,7 @@ static VALUE rb_git_remote_ls(int argc, VALUE *argv, VALUE self)
|
|
237
248
|
git_remote_callbacks callbacks = GIT_REMOTE_CALLBACKS_INIT;
|
238
249
|
const git_remote_head **heads;
|
239
250
|
|
240
|
-
struct rugged_remote_cb_payload payload = { Qnil, Qnil, Qnil, Qnil, Qnil, 0 };
|
251
|
+
struct rugged_remote_cb_payload payload = { Qnil, Qnil, Qnil, Qnil, Qnil, Qnil, 0 };
|
241
252
|
|
242
253
|
VALUE rb_options;
|
243
254
|
|
@@ -251,8 +262,7 @@ static VALUE rb_git_remote_ls(int argc, VALUE *argv, VALUE self)
|
|
251
262
|
if (!rb_block_given_p())
|
252
263
|
return rb_funcall(self, rb_intern("to_enum"), 2, CSTR2SYM("ls"), rb_options);
|
253
264
|
|
254
|
-
|
255
|
-
rugged_remote_init_callbacks_and_payload_from_options(rb_options, &callbacks, &payload);
|
265
|
+
rugged_remote_init_callbacks_and_payload_from_options(rb_options, &callbacks, &payload);
|
256
266
|
|
257
267
|
if ((error = git_remote_set_callbacks(remote, &callbacks)) ||
|
258
268
|
(error = git_remote_connect(remote, GIT_DIRECTION_FETCH)) ||
|
@@ -527,7 +537,7 @@ static VALUE rb_git_remote_check_connection(int argc, VALUE *argv, VALUE self)
|
|
527
537
|
{
|
528
538
|
git_remote *remote;
|
529
539
|
git_remote_callbacks callbacks = GIT_REMOTE_CALLBACKS_INIT;
|
530
|
-
struct rugged_remote_cb_payload payload = { Qnil, Qnil, Qnil, Qnil, Qnil, 0 };
|
540
|
+
struct rugged_remote_cb_payload payload = { Qnil, Qnil, Qnil, Qnil, Qnil, Qnil, 0 };
|
531
541
|
VALUE rb_direction, rb_options;
|
532
542
|
ID id_direction;
|
533
543
|
int error, direction;
|
@@ -544,8 +554,7 @@ static VALUE rb_git_remote_check_connection(int argc, VALUE *argv, VALUE self)
|
|
544
554
|
else
|
545
555
|
rb_raise(rb_eTypeError, "Invalid direction. Expected :fetch or :push");
|
546
556
|
|
547
|
-
|
548
|
-
rugged_remote_init_callbacks_and_payload_from_options(rb_options, &callbacks, &payload);
|
557
|
+
rugged_remote_init_callbacks_and_payload_from_options(rb_options, &callbacks, &payload);
|
549
558
|
|
550
559
|
if ((error = git_remote_set_callbacks(remote, &callbacks)) < 0)
|
551
560
|
goto cleanup;
|
@@ -618,7 +627,7 @@ static VALUE rb_git_remote_fetch(int argc, VALUE *argv, VALUE self)
|
|
618
627
|
git_signature *signature = NULL;
|
619
628
|
git_strarray refspecs;
|
620
629
|
git_remote_callbacks callbacks = GIT_REMOTE_CALLBACKS_INIT;
|
621
|
-
struct rugged_remote_cb_payload payload = { Qnil, Qnil, Qnil, Qnil, Qnil, 0 };
|
630
|
+
struct rugged_remote_cb_payload payload = { Qnil, Qnil, Qnil, Qnil, Qnil, Qnil, 0 };
|
622
631
|
|
623
632
|
char *log_message = NULL;
|
624
633
|
int error;
|
@@ -633,6 +642,8 @@ static VALUE rb_git_remote_fetch(int argc, VALUE *argv, VALUE self)
|
|
633
642
|
rugged_check_repo(rb_repo);
|
634
643
|
Data_Get_Struct(rb_repo, git_repository, repo);
|
635
644
|
|
645
|
+
rugged_remote_init_callbacks_and_payload_from_options(rb_options, &callbacks, &payload);
|
646
|
+
|
636
647
|
if (!NIL_P(rb_options)) {
|
637
648
|
VALUE rb_val = rb_hash_aref(rb_options, CSTR2SYM("signature"));
|
638
649
|
if (!NIL_P(rb_val))
|
@@ -641,8 +652,6 @@ static VALUE rb_git_remote_fetch(int argc, VALUE *argv, VALUE self)
|
|
641
652
|
rb_val = rb_hash_aref(rb_options, CSTR2SYM("message"));
|
642
653
|
if (!NIL_P(rb_val))
|
643
654
|
log_message = StringValueCStr(rb_val);
|
644
|
-
|
645
|
-
rugged_remote_init_callbacks_and_payload_from_options(rb_options, &callbacks, &payload);
|
646
655
|
}
|
647
656
|
|
648
657
|
if ((error = git_remote_set_callbacks(remote, &callbacks)))
|
@@ -674,15 +683,6 @@ static VALUE rb_git_remote_fetch(int argc, VALUE *argv, VALUE self)
|
|
674
683
|
return rb_result;
|
675
684
|
}
|
676
685
|
|
677
|
-
static int push_status_cb(const char *ref, const char *msg, void *payload)
|
678
|
-
{
|
679
|
-
VALUE rb_result_hash = (VALUE)payload;
|
680
|
-
if (msg != NULL)
|
681
|
-
rb_hash_aset(rb_result_hash, rb_str_new_utf8(ref), rb_str_new_utf8(msg));
|
682
|
-
|
683
|
-
return GIT_OK;
|
684
|
-
}
|
685
|
-
|
686
686
|
/*
|
687
687
|
* call-seq:
|
688
688
|
* remote.push(refspecs = nil, options = {}) -> hash
|
@@ -721,36 +721,30 @@ static VALUE rb_git_remote_push(int argc, VALUE *argv, VALUE self)
|
|
721
721
|
{
|
722
722
|
VALUE rb_refspecs, rb_options, rb_val;
|
723
723
|
VALUE rb_repo = rugged_owner(self);
|
724
|
-
VALUE rb_exception = Qnil, rb_result = rb_hash_new();
|
725
724
|
|
726
725
|
git_repository *repo;
|
727
|
-
git_remote *remote
|
726
|
+
git_remote *remote;
|
728
727
|
git_remote_callbacks callbacks = GIT_REMOTE_CALLBACKS_INIT;
|
729
|
-
git_push *push = NULL;
|
730
728
|
git_signature *signature = NULL;
|
729
|
+
git_strarray refspecs;
|
730
|
+
git_push_options opts = GIT_PUSH_OPTIONS_INIT;
|
731
731
|
|
732
|
-
int error = 0
|
732
|
+
int error = 0;
|
733
733
|
char *log_message = NULL;
|
734
734
|
|
735
|
-
struct rugged_remote_cb_payload payload = { Qnil, Qnil, Qnil, Qnil, 0 };
|
735
|
+
struct rugged_remote_cb_payload payload = { Qnil, Qnil, Qnil, Qnil, Qnil, rb_hash_new(), 0 };
|
736
736
|
|
737
737
|
rb_scan_args(argc, argv, "01:", &rb_refspecs, &rb_options);
|
738
738
|
|
739
|
-
|
740
|
-
Check_Type(rb_refspecs, T_ARRAY);
|
741
|
-
for (i = 0; i < RARRAY_LEN(rb_refspecs); ++i) {
|
742
|
-
VALUE rb_refspec = rb_ary_entry(rb_refspecs, i);
|
743
|
-
Check_Type(rb_refspec, T_STRING);
|
744
|
-
}
|
745
|
-
}
|
739
|
+
rugged_rb_ary_to_strarray(rb_refspecs, &refspecs);
|
746
740
|
|
747
741
|
rugged_check_repo(rb_repo);
|
748
742
|
Data_Get_Struct(rb_repo, git_repository, repo);
|
749
743
|
Data_Get_Struct(self, git_remote, remote);
|
750
744
|
|
751
|
-
|
752
|
-
rugged_remote_init_callbacks_and_payload_from_options(rb_options, &callbacks, &payload);
|
745
|
+
rugged_remote_init_callbacks_and_payload_from_options(rb_options, &callbacks, &payload);
|
753
746
|
|
747
|
+
if (!NIL_P(rb_options)) {
|
754
748
|
rb_val = rb_hash_aref(rb_options, CSTR2SYM("message"));
|
755
749
|
if (!NIL_P(rb_val))
|
756
750
|
log_message = StringValueCStr(rb_val);
|
@@ -760,64 +754,21 @@ static VALUE rb_git_remote_push(int argc, VALUE *argv, VALUE self)
|
|
760
754
|
signature = rugged_signature_get(rb_val, repo);
|
761
755
|
}
|
762
756
|
|
763
|
-
|
764
|
-
if ((error = git_remote_dup(&tmp_remote, remote)) ||
|
765
|
-
(error = git_remote_set_callbacks(tmp_remote, &callbacks)))
|
757
|
+
if ((error = git_remote_set_callbacks(remote, &callbacks)))
|
766
758
|
goto cleanup;
|
767
759
|
|
768
|
-
|
769
|
-
git_remote_clear_refspecs(tmp_remote);
|
770
|
-
|
771
|
-
for (i = 0; !error && i < RARRAY_LEN(rb_refspecs); ++i) {
|
772
|
-
VALUE rb_refspec = rb_ary_entry(rb_refspecs, i);
|
773
|
-
|
774
|
-
if ((error = git_remote_add_push(tmp_remote, StringValueCStr(rb_refspec))))
|
775
|
-
goto cleanup;
|
776
|
-
}
|
777
|
-
}
|
778
|
-
|
779
|
-
if ((error = git_push_new(&push, tmp_remote)))
|
780
|
-
goto cleanup;
|
781
|
-
|
782
|
-
// TODO: Get rid of this once git_remote_push lands in libgit2.
|
783
|
-
{
|
784
|
-
git_strarray push_refspecs;
|
785
|
-
size_t i;
|
786
|
-
|
787
|
-
if ((error = git_remote_get_push_refspecs(&push_refspecs, tmp_remote)))
|
788
|
-
goto cleanup;
|
789
|
-
|
790
|
-
if (push_refspecs.count == 0) {
|
791
|
-
rb_exception = rb_exc_new2(rb_eRuggedError, "no pushspecs are configured for the given remote");
|
792
|
-
goto cleanup;
|
793
|
-
}
|
794
|
-
|
795
|
-
for (i = 0; !error && i < push_refspecs.count; ++i) {
|
796
|
-
error = git_push_add_refspec(push, push_refspecs.strings[i]);
|
797
|
-
}
|
798
|
-
|
799
|
-
git_strarray_free(&push_refspecs);
|
800
|
-
if (error) goto cleanup;
|
801
|
-
}
|
802
|
-
|
803
|
-
if ((error = git_push_finish(push)))
|
804
|
-
goto cleanup;
|
805
|
-
|
806
|
-
if ((error = git_push_status_foreach(push, &push_status_cb, (void *)rb_result)) ||
|
807
|
-
(error = git_push_update_tips(push, signature, log_message)))
|
808
|
-
goto cleanup;
|
760
|
+
error = git_remote_push(remote, &refspecs, &opts, signature, log_message);
|
809
761
|
|
810
762
|
cleanup:
|
811
|
-
|
812
|
-
git_remote_free(tmp_remote);
|
763
|
+
xfree(refspecs.strings);
|
813
764
|
git_signature_free(signature);
|
814
765
|
|
815
|
-
if (
|
816
|
-
|
766
|
+
if (payload.exception)
|
767
|
+
rb_jump_tag(payload.exception);
|
817
768
|
|
818
769
|
rugged_exception_check(error);
|
819
770
|
|
820
|
-
return
|
771
|
+
return payload.result;
|
821
772
|
}
|
822
773
|
|
823
774
|
void Init_rugged_remote(void)
|
@@ -251,7 +251,8 @@ static VALUE rb_git_remote_collection_rename(VALUE self, VALUE rb_name_or_remote
|
|
251
251
|
{
|
252
252
|
VALUE rb_repo = rugged_owner(self);
|
253
253
|
git_repository *repo;
|
254
|
-
|
254
|
+
size_t i;
|
255
|
+
int error, exception;
|
255
256
|
git_strarray problems;
|
256
257
|
|
257
258
|
if (!rb_block_given_p())
|
data/ext/rugged/rugged_repo.c
CHANGED
@@ -24,6 +24,9 @@
|
|
24
24
|
|
25
25
|
#include "rugged.h"
|
26
26
|
#include <git2/sys/repository.h>
|
27
|
+
#include <git2/sys/odb_backend.h>
|
28
|
+
#include <git2/sys/refdb_backend.h>
|
29
|
+
#include <git2/refs.h>
|
27
30
|
|
28
31
|
extern VALUE rb_mRugged;
|
29
32
|
extern VALUE rb_eRuggedError;
|
@@ -35,6 +38,7 @@ extern VALUE rb_cRuggedCommit;
|
|
35
38
|
extern VALUE rb_cRuggedTag;
|
36
39
|
extern VALUE rb_cRuggedTree;
|
37
40
|
extern VALUE rb_cRuggedReference;
|
41
|
+
extern VALUE rb_cRuggedBackend;
|
38
42
|
|
39
43
|
extern VALUE rb_cRuggedCredPlaintext;
|
40
44
|
extern VALUE rb_cRuggedCredSshKey;
|
@@ -182,9 +186,78 @@ static void load_alternates(git_repository *repo, VALUE rb_alternates)
|
|
182
186
|
rugged_exception_check(error);
|
183
187
|
}
|
184
188
|
|
189
|
+
static void rugged_repo_new_with_backend(git_repository **repo, VALUE rb_path, VALUE rb_backend)
|
190
|
+
{
|
191
|
+
char *path;
|
192
|
+
|
193
|
+
git_odb *odb = NULL;
|
194
|
+
git_odb_backend *odb_backend = NULL;
|
195
|
+
git_refdb *refdb = NULL;
|
196
|
+
git_refdb_backend *refdb_backend = NULL;
|
197
|
+
git_reference *head = NULL;
|
198
|
+
rugged_backend *backend;
|
199
|
+
|
200
|
+
int error = 0;
|
201
|
+
|
202
|
+
Check_Type(rb_path, T_STRING);
|
203
|
+
path = StringValueCStr(rb_path);
|
204
|
+
|
205
|
+
if (rb_obj_is_kind_of(rb_backend, rb_cRuggedBackend) == Qfalse) {
|
206
|
+
rb_raise(rb_eRuggedError, "Backend must be an instance of Rugged::Backend");
|
207
|
+
}
|
208
|
+
|
209
|
+
Data_Get_Struct(rb_backend, rugged_backend, backend);
|
210
|
+
|
211
|
+
error = git_odb_new(&odb);
|
212
|
+
if (error) goto cleanup;
|
213
|
+
|
214
|
+
error = backend->odb_backend(&odb_backend, backend, path);
|
215
|
+
if (error) goto cleanup;
|
216
|
+
|
217
|
+
error = git_odb_add_backend(odb, odb_backend, 1);
|
218
|
+
if (error) goto cleanup;
|
219
|
+
|
220
|
+
error = git_repository_wrap_odb(repo, odb);
|
221
|
+
if (error) goto cleanup;
|
222
|
+
|
223
|
+
error = git_refdb_new(&refdb, *repo);
|
224
|
+
if (error) goto cleanup;
|
225
|
+
|
226
|
+
error = backend->refdb_backend(&refdb_backend, backend, path);
|
227
|
+
if (error) goto cleanup;
|
228
|
+
|
229
|
+
error = git_refdb_set_backend(refdb, refdb_backend);
|
230
|
+
if (error) goto cleanup;
|
231
|
+
|
232
|
+
git_repository_set_refdb(*repo, refdb);
|
233
|
+
|
234
|
+
error = git_reference_lookup(&head, *repo, "HEAD");
|
235
|
+
|
236
|
+
if (error == GIT_ENOTFOUND) {
|
237
|
+
giterr_clear();
|
238
|
+
error = git_reference_symbolic_create(&head, *repo, "HEAD", "refs/heads/master", 0, NULL, NULL);
|
239
|
+
}
|
240
|
+
|
241
|
+
if (!error) {
|
242
|
+
git_reference_free(head);
|
243
|
+
return;
|
244
|
+
}
|
245
|
+
|
246
|
+
cleanup:
|
247
|
+
git_repository_free(*repo);
|
248
|
+
git_odb_free(odb);
|
249
|
+
git_refdb_free(refdb);
|
250
|
+
|
251
|
+
if (odb_backend != NULL) odb_backend->free(odb_backend);
|
252
|
+
if (refdb_backend != NULL) refdb_backend->free(refdb_backend);
|
253
|
+
|
254
|
+
rugged_exception_check(error);
|
255
|
+
}
|
256
|
+
|
185
257
|
/*
|
186
258
|
* call-seq:
|
187
|
-
* Repository.bare(path[, alternates]) -> repository
|
259
|
+
* Repository.bare(path[, alternates]) -> repository OR
|
260
|
+
* Repository.bare(path[, options]) -> repository
|
188
261
|
*
|
189
262
|
* Open a bare Git repository at +path+ and return a +Repository+
|
190
263
|
* object representing it.
|
@@ -193,23 +266,52 @@ static void load_alternates(git_repository *repo, VALUE rb_alternates)
|
|
193
266
|
* any +.git+ directory discovery, won't try to load the config options to
|
194
267
|
* determine whether the repository is bare and won't try to load the workdir.
|
195
268
|
*
|
196
|
-
* Optionally, you can pass a list of alternate object folders.
|
269
|
+
* Optionally, you can pass a list of alternate object folders or an options Hash.
|
197
270
|
*
|
198
271
|
* Rugged::Repository.bare(path, ['./other/repo/.git/objects'])
|
272
|
+
* Rugged::Repository.bare(path, opts)
|
273
|
+
*
|
274
|
+
* The following options can be passed in the +options+ Hash:
|
275
|
+
*
|
276
|
+
* :backend ::
|
277
|
+
* A Rugged::Backend instance
|
278
|
+
* :alternates ::
|
279
|
+
* A list of alternate object folders.
|
280
|
+
* Rugged::Repository.bare(path, :alternates => ['./other/repo/.git/objects'])
|
199
281
|
*/
|
200
282
|
static VALUE rb_git_repo_open_bare(int argc, VALUE *argv, VALUE klass)
|
201
283
|
{
|
202
|
-
git_repository *repo;
|
284
|
+
git_repository *repo = NULL;
|
203
285
|
int error = 0;
|
204
|
-
VALUE rb_path, rb_alternates;
|
286
|
+
VALUE rb_path, rb_options, rb_alternates = 0;
|
205
287
|
|
206
|
-
rb_scan_args(argc, argv, "11", &rb_path, &
|
207
|
-
Check_Type(rb_path, T_STRING);
|
288
|
+
rb_scan_args(argc, argv, "11", &rb_path, &rb_options);
|
208
289
|
|
209
|
-
|
210
|
-
|
290
|
+
if (!NIL_P(rb_options) && TYPE(rb_options) == T_ARRAY)
|
291
|
+
rb_alternates = rb_options;
|
292
|
+
|
293
|
+
if (!NIL_P(rb_options) && TYPE(rb_options) == T_HASH) {
|
294
|
+
/* Check for `:backend` */
|
295
|
+
VALUE rb_backend = rb_hash_aref(rb_options, CSTR2SYM("backend"));
|
296
|
+
|
297
|
+
if (!NIL_P(rb_backend)) {
|
298
|
+
rugged_repo_new_with_backend(&repo, rb_path, rb_backend);
|
299
|
+
}
|
211
300
|
|
212
|
-
|
301
|
+
/* Check for `:alternates` */
|
302
|
+
rb_alternates = rb_hash_aref(rb_options, CSTR2SYM("alternates"));
|
303
|
+
}
|
304
|
+
|
305
|
+
if (!repo) {
|
306
|
+
Check_Type(rb_path, T_STRING);
|
307
|
+
|
308
|
+
error = git_repository_open_bare(&repo, StringValueCStr(rb_path));
|
309
|
+
rugged_exception_check(error);
|
310
|
+
}
|
311
|
+
|
312
|
+
if (rb_alternates) {
|
313
|
+
load_alternates(repo, rb_alternates);
|
314
|
+
}
|
213
315
|
|
214
316
|
return rugged_repo_new(klass, repo);
|
215
317
|
}
|
@@ -235,7 +337,7 @@ static VALUE rb_git_repo_open_bare(int argc, VALUE *argv, VALUE klass)
|
|
235
337
|
*
|
236
338
|
* Examples:
|
237
339
|
*
|
238
|
-
* Rugged::Repository.new('
|
340
|
+
* Rugged::Repository.new('test/.git') #=> #<Rugged::Repository:0x108849488>
|
239
341
|
* Rugged::Repository.new(path, :alternates => ['./other/repo/.git/objects'])
|
240
342
|
*/
|
241
343
|
static VALUE rb_git_repo_new(int argc, VALUE *argv, VALUE klass)
|
@@ -260,7 +362,7 @@ static VALUE rb_git_repo_new(int argc, VALUE *argv, VALUE klass)
|
|
260
362
|
|
261
363
|
/*
|
262
364
|
* call-seq:
|
263
|
-
* Repository.init_at(path, is_bare = false) -> repository
|
365
|
+
* Repository.init_at(path, is_bare = false, opts = {}) -> repository
|
264
366
|
*
|
265
367
|
* Initialize a Git repository in +path+. This implies creating all the
|
266
368
|
* necessary files on the FS, or re-initializing an already existing
|
@@ -272,19 +374,36 @@ static VALUE rb_git_repo_new(int argc, VALUE *argv, VALUE klass)
|
|
272
374
|
* of +path+. Non-bare repositories are created in a +.git+ folder and
|
273
375
|
* use +path+ as working directory.
|
274
376
|
*
|
275
|
-
*
|
377
|
+
* The following options can be passed in the +options+ Hash:
|
378
|
+
*
|
379
|
+
* :backend ::
|
380
|
+
* A Rugged::Backend instance
|
381
|
+
*
|
382
|
+
*
|
383
|
+
* Rugged::Repository.init_at('repository', :bare) #=> #<Rugged::Repository:0x108849488>
|
276
384
|
*/
|
277
385
|
static VALUE rb_git_repo_init_at(int argc, VALUE *argv, VALUE klass)
|
278
386
|
{
|
279
|
-
git_repository *repo;
|
280
|
-
VALUE rb_path, rb_is_bare;
|
387
|
+
git_repository *repo = NULL;
|
388
|
+
VALUE rb_path, rb_is_bare, rb_options;
|
389
|
+
int error;
|
281
390
|
|
282
|
-
rb_scan_args(argc, argv, "11", &rb_path, &rb_is_bare);
|
391
|
+
rb_scan_args(argc, argv, "11:", &rb_path, &rb_is_bare, &rb_options);
|
283
392
|
Check_Type(rb_path, T_STRING);
|
284
393
|
|
285
|
-
|
286
|
-
|
287
|
-
|
394
|
+
if (!NIL_P(rb_options)) {
|
395
|
+
/* Check for `:backend` */
|
396
|
+
VALUE rb_backend = rb_hash_aref(rb_options, CSTR2SYM("backend"));
|
397
|
+
|
398
|
+
if (rb_backend && !NIL_P(rb_backend)) {
|
399
|
+
rugged_repo_new_with_backend(&repo, rb_path, rb_backend);
|
400
|
+
}
|
401
|
+
}
|
402
|
+
|
403
|
+
if(!repo) {
|
404
|
+
error = git_repository_init(&repo, StringValueCStr(rb_path), RTEST(rb_is_bare));
|
405
|
+
rugged_exception_check(error);
|
406
|
+
}
|
288
407
|
|
289
408
|
return rugged_repo_new(klass, repo);
|
290
409
|
}
|
@@ -526,19 +645,21 @@ static VALUE rb_git_repo_merge_base(VALUE self, VALUE rb_args)
|
|
526
645
|
*/
|
527
646
|
static VALUE rb_git_repo_merge_bases(VALUE self, VALUE rb_args)
|
528
647
|
{
|
529
|
-
int error = GIT_OK
|
648
|
+
int error = GIT_OK;
|
649
|
+
size_t i, len = (size_t)RARRAY_LEN(rb_args);
|
530
650
|
git_repository *repo;
|
531
651
|
git_oidarray bases = {NULL, 0};
|
532
|
-
git_oid *input_array
|
533
|
-
int len = (int)RARRAY_LEN(rb_args);
|
652
|
+
git_oid *input_array;
|
534
653
|
|
535
654
|
VALUE rb_bases;
|
536
655
|
|
537
656
|
if (len < 2)
|
538
|
-
rb_raise(rb_eArgError, "wrong number of arguments (%
|
657
|
+
rb_raise(rb_eArgError, "wrong number of arguments (%ld for 2+)", RARRAY_LEN(rb_args));
|
539
658
|
|
540
659
|
Data_Get_Struct(self, git_repository, repo);
|
541
660
|
|
661
|
+
input_array = xmalloc(sizeof(git_oid) * len);
|
662
|
+
|
542
663
|
for (i = 0; !error && i < len; ++i) {
|
543
664
|
error = rugged_oid_get(&input_array[i], repo, rb_ary_entry(rb_args, i));
|
544
665
|
}
|
@@ -585,7 +706,7 @@ static VALUE rb_git_repo_merge_bases(VALUE self, VALUE rb_args)
|
|
585
706
|
* :fastforward ::
|
586
707
|
* The given commit is a fast-forward from HEAD and no merge needs to be
|
587
708
|
* performed. HEAD can simply be set to the given commit.
|
588
|
-
*
|
709
|
+
*
|
589
710
|
* :unborn ::
|
590
711
|
* The HEAD of the current repository is "unborn" and does not point to
|
591
712
|
* a valid commit. No merge can be performed, but the caller may wish
|
@@ -1116,8 +1237,12 @@ static VALUE rb_git_repo_get_head(VALUE self)
|
|
1116
1237
|
static VALUE rb_git_repo_path(VALUE self)
|
1117
1238
|
{
|
1118
1239
|
git_repository *repo;
|
1240
|
+
const char *path;
|
1241
|
+
|
1119
1242
|
Data_Get_Struct(self, git_repository, repo);
|
1120
|
-
|
1243
|
+
path = git_repository_path(repo);
|
1244
|
+
|
1245
|
+
return path ? rb_str_new_utf8(path) : Qnil;
|
1121
1246
|
}
|
1122
1247
|
|
1123
1248
|
/*
|