rugged 0.21.0 → 0.21.1b0
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 +4 -4
- data/README.md +12 -5
- data/ext/rugged/extconf.rb +8 -8
- data/ext/rugged/rugged.h +1 -1
- data/ext/rugged/rugged_cred.c +23 -0
- data/ext/rugged/rugged_index.c +5 -1
- data/ext/rugged/rugged_remote.c +68 -0
- data/ext/rugged/rugged_repo.c +287 -5
- data/ext/rugged/rugged_tag_collection.c +70 -2
- data/ext/rugged/rugged_tree.c +29 -10
- data/lib/rugged.rb +1 -0
- data/lib/rugged/attributes.rb +41 -0
- data/lib/rugged/diff.rb +0 -1
- data/lib/rugged/diff/line.rb +1 -3
- data/lib/rugged/patch.rb +12 -2
- data/lib/rugged/version.rb +1 -1
- data/vendor/libgit2/CMakeLists.txt +11 -0
- data/vendor/libgit2/cmake/Modules/FindGSSAPI.cmake +324 -0
- data/vendor/libgit2/deps/http-parser/http_parser.h +2 -0
- data/vendor/libgit2/deps/zlib/adler32.c +39 -29
- data/vendor/libgit2/deps/zlib/crc32.c +33 -50
- data/vendor/libgit2/deps/zlib/crc32.h +1 -1
- data/vendor/libgit2/deps/zlib/deflate.c +198 -65
- data/vendor/libgit2/deps/zlib/deflate.h +8 -4
- data/vendor/libgit2/deps/zlib/infback.c +640 -0
- data/vendor/libgit2/deps/zlib/inffast.c +3 -3
- data/vendor/libgit2/deps/zlib/inffixed.h +3 -3
- data/vendor/libgit2/deps/zlib/inflate.c +84 -52
- data/vendor/libgit2/deps/zlib/inftrees.c +15 -39
- data/vendor/libgit2/deps/zlib/trees.c +18 -36
- data/vendor/libgit2/deps/zlib/zconf.h +4 -0
- data/vendor/libgit2/deps/zlib/zlib.h +250 -95
- data/vendor/libgit2/deps/zlib/zutil.c +13 -10
- data/vendor/libgit2/deps/zlib/zutil.h +41 -62
- data/vendor/libgit2/include/git2/attr.h +16 -13
- data/vendor/libgit2/include/git2/buffer.h +16 -0
- data/vendor/libgit2/include/git2/checkout.h +12 -12
- data/vendor/libgit2/include/git2/cherrypick.h +15 -15
- data/vendor/libgit2/include/git2/clone.h +77 -69
- data/vendor/libgit2/include/git2/diff.h +7 -0
- data/vendor/libgit2/include/git2/errors.h +1 -0
- data/vendor/libgit2/include/git2/merge.h +16 -0
- data/vendor/libgit2/include/git2/oid.h +8 -4
- data/vendor/libgit2/include/git2/oidarray.h +40 -0
- data/vendor/libgit2/include/git2/remote.h +5 -24
- data/vendor/libgit2/include/git2/repository.h +4 -1
- data/vendor/libgit2/include/git2/reset.h +4 -0
- data/vendor/libgit2/include/git2/status.h +17 -14
- data/vendor/libgit2/include/git2/submodule.h +18 -0
- data/vendor/libgit2/include/git2/sys/transport.h +354 -0
- data/vendor/libgit2/include/git2/transport.h +34 -327
- data/vendor/libgit2/include/git2/types.h +16 -6
- data/vendor/libgit2/src/array.h +1 -1
- data/vendor/libgit2/src/attr_file.c +14 -1
- data/vendor/libgit2/src/blame.c +0 -1
- data/vendor/libgit2/src/buffer.c +67 -10
- data/vendor/libgit2/src/buffer.h +4 -2
- data/vendor/libgit2/src/cache.c +9 -9
- data/vendor/libgit2/src/cache.h +1 -1
- data/vendor/libgit2/src/checkout.c +118 -23
- data/vendor/libgit2/src/cherrypick.c +41 -44
- data/vendor/libgit2/src/clone.c +94 -56
- data/vendor/libgit2/src/config_file.c +4 -4
- data/vendor/libgit2/src/diff.c +21 -0
- data/vendor/libgit2/src/diff_file.c +1 -0
- data/vendor/libgit2/src/diff_print.c +11 -9
- data/vendor/libgit2/src/diff_tform.c +3 -1
- data/vendor/libgit2/src/errors.c +9 -7
- data/vendor/libgit2/src/fileops.c +5 -3
- data/vendor/libgit2/src/global.c +9 -1
- data/vendor/libgit2/src/global.h +1 -0
- data/vendor/libgit2/src/graph.c +2 -2
- data/vendor/libgit2/src/indexer.c +6 -1
- data/vendor/libgit2/src/merge.c +98 -144
- data/vendor/libgit2/src/merge.h +1 -1
- data/vendor/libgit2/src/netops.c +4 -0
- data/vendor/libgit2/src/oid.c +8 -0
- data/vendor/libgit2/src/oid.h +11 -0
- data/vendor/libgit2/src/oidarray.c +21 -0
- data/vendor/libgit2/src/oidarray.h +18 -0
- data/vendor/libgit2/src/pack.c +1 -4
- data/vendor/libgit2/src/path.c +93 -33
- data/vendor/libgit2/src/path.h +21 -0
- data/vendor/libgit2/src/pool.c +1 -1
- data/vendor/libgit2/src/posix.h +46 -28
- data/vendor/libgit2/src/refs.h +2 -2
- data/vendor/libgit2/src/refspec.c +54 -18
- data/vendor/libgit2/src/remote.c +31 -8
- data/vendor/libgit2/src/remote.h +3 -0
- data/vendor/libgit2/src/repository.c +27 -11
- data/vendor/libgit2/src/revert.c +4 -6
- data/vendor/libgit2/src/revparse.c +15 -18
- data/vendor/libgit2/src/revwalk.c +0 -3
- data/vendor/libgit2/src/signature.c +2 -2
- data/vendor/libgit2/src/stash.c +2 -1
- data/vendor/libgit2/src/status.c +11 -2
- data/vendor/libgit2/src/strnlen.h +2 -1
- data/vendor/libgit2/src/submodule.c +73 -33
- data/vendor/libgit2/src/thread-utils.h +0 -7
- data/vendor/libgit2/src/trace.h +9 -1
- data/vendor/libgit2/src/transport.c +93 -90
- data/vendor/libgit2/src/transports/auth.c +71 -0
- data/vendor/libgit2/src/transports/auth.h +63 -0
- data/vendor/libgit2/src/transports/auth_negotiate.c +275 -0
- data/vendor/libgit2/src/transports/auth_negotiate.h +27 -0
- data/vendor/libgit2/src/transports/cred.c +58 -0
- data/vendor/libgit2/src/transports/cred.h +14 -0
- data/vendor/libgit2/src/transports/cred_helpers.c +3 -0
- data/vendor/libgit2/src/transports/git.c +1 -0
- data/vendor/libgit2/src/transports/http.c +168 -76
- data/vendor/libgit2/src/transports/smart.h +1 -0
- data/vendor/libgit2/src/transports/smart_protocol.c +4 -2
- data/vendor/libgit2/src/transports/ssh.c +214 -38
- data/vendor/libgit2/src/transports/winhttp.c +26 -6
- data/vendor/libgit2/src/unix/posix.h +23 -9
- data/vendor/libgit2/src/unix/realpath.c +8 -7
- data/vendor/libgit2/src/util.c +2 -1
- data/vendor/libgit2/src/util.h +3 -3
- data/vendor/libgit2/src/win32/mingw-compat.h +5 -12
- data/vendor/libgit2/src/win32/msvc-compat.h +3 -32
- data/vendor/libgit2/src/win32/posix.h +20 -31
- data/vendor/libgit2/src/win32/posix_w32.c +33 -4
- metadata +81 -69
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 71c12ca95964095a5400cc76eeb9b98c1c116a69
|
|
4
|
+
data.tar.gz: 752fefe7898903eeeef4139198eb6a719b044059
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4b16dedcf38b935c0d7a17c3b4c34c11f3280dafc6247f6b8ce88fa81e1f66696b3e2ae695405f75e3f8cc9c45eeff8017375156b6328fc3c8f285d31f3d1043
|
|
7
|
+
data.tar.gz: 3b0f3d1bc1f12cf4f8f65cafc7ea4028239787225e0b04aa5e9476e85171dcf5ed0e1621b03eb070fa2273d3c7a5307932a82602b5cc2e76972b5fd54af676cd
|
data/README.md
CHANGED
|
@@ -17,7 +17,12 @@ Rugged is a self-contained gem. You can install it by running:
|
|
|
17
17
|
|
|
18
18
|
$ gem install rugged
|
|
19
19
|
|
|
20
|
-
You need to have CMake installed on your system to be able to build the included version of `libgit2`.
|
|
20
|
+
You need to have CMake and `pkg-config` installed on your system to be able to build the included version of `libgit2`. On OS X, after installing [Homebrew](http://brew.sh/), you can get CMake with:
|
|
21
|
+
```bash
|
|
22
|
+
$ brew install cmake
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
If you want to build Rugged with HTTPS and SSH support, check out the list of optional [libgit2 dependencies](https://github.com/libgit2/libgit2#optional-dependencies).
|
|
21
26
|
|
|
22
27
|
If you're using bundler and want to bundle `libgit2` with Rugged, you can use the `:submodules` option:
|
|
23
28
|
|
|
@@ -96,7 +101,7 @@ repo.bare?
|
|
|
96
101
|
# => false
|
|
97
102
|
repo.empty?
|
|
98
103
|
# => true
|
|
99
|
-
repo.
|
|
104
|
+
repo.head_unborn?
|
|
100
105
|
# => false
|
|
101
106
|
repo.head_detached?
|
|
102
107
|
# => false
|
|
@@ -109,13 +114,15 @@ repo.workdir
|
|
|
109
114
|
|
|
110
115
|
# The HEAD of the repository.
|
|
111
116
|
ref = repo.head
|
|
112
|
-
# => #<Rugged::Reference:2228467240 {name: "refs/heads/master", target: "
|
|
117
|
+
# => #<Rugged::Reference:2228467240 {name: "refs/heads/master", target: #<Rugged::Commit:2228467250 {message: "helpful message", tree: #<Rugged::Tree:2228467260 {oid: 5d6f29220a0783b8085134df14ec4d960b6c3bf2}>}>
|
|
113
118
|
|
|
114
|
-
# From the returned ref, you can also access the `name` and
|
|
119
|
+
# From the returned ref, you can also access the `name`, `target`, and target SHA:
|
|
115
120
|
ref.name
|
|
116
121
|
# => "refs/heads/master"
|
|
117
122
|
ref.target
|
|
118
|
-
# => "
|
|
123
|
+
# => #<Rugged::Commit:2228467250 {message: "helpful message", tree: #<Rugged::Tree:2228467260 {oid: 5d6f29220a0783b8085134df14ec4d960b6c3bf2}>}>
|
|
124
|
+
ref.target_id
|
|
125
|
+
# => "2bc6a70483369f33f641ca44873497f13a15cde5"
|
|
119
126
|
|
|
120
127
|
# Reading an object
|
|
121
128
|
object = repo.read('a0ae5566e3c8a3bddffab21022056f0b5e03ef07')
|
data/ext/rugged/extconf.rb
CHANGED
|
@@ -15,18 +15,10 @@ def sys(cmd)
|
|
|
15
15
|
ret
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
-
if !find_executable('cmake')
|
|
19
|
-
abort "ERROR: CMake is required to build Rugged."
|
|
20
|
-
end
|
|
21
|
-
|
|
22
18
|
if !(MAKE = find_executable('gmake') || find_executable('make'))
|
|
23
19
|
abort "ERROR: GNU make is required to build Rugged."
|
|
24
20
|
end
|
|
25
21
|
|
|
26
|
-
if !find_executable('pkg-config')
|
|
27
|
-
abort "ERROR: pkg-config is required to build Rugged."
|
|
28
|
-
end
|
|
29
|
-
|
|
30
22
|
if arg_config("--use-system-libraries", !!ENV['RUGGED_USE_SYSTEM_LIBRARIES'])
|
|
31
23
|
puts "Building Rugged using system libraries.\n"
|
|
32
24
|
|
|
@@ -40,6 +32,14 @@ if arg_config("--use-system-libraries", !!ENV['RUGGED_USE_SYSTEM_LIBRARIES'])
|
|
|
40
32
|
#endif
|
|
41
33
|
SRC
|
|
42
34
|
else
|
|
35
|
+
if !find_executable('cmake')
|
|
36
|
+
abort "ERROR: CMake is required to build Rugged."
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
if !find_executable('pkg-config')
|
|
40
|
+
abort "ERROR: pkg-config is required to build Rugged."
|
|
41
|
+
end
|
|
42
|
+
|
|
43
43
|
CWD = File.expand_path(File.dirname(__FILE__))
|
|
44
44
|
LIBGIT2_DIR = File.join(CWD, '..', '..', 'vendor', 'libgit2')
|
|
45
45
|
|
data/ext/rugged/rugged.h
CHANGED
|
@@ -120,7 +120,7 @@ static inline VALUE rugged_owner(VALUE object)
|
|
|
120
120
|
static inline void rugged_validate_remote_url(VALUE rb_url)
|
|
121
121
|
{
|
|
122
122
|
Check_Type(rb_url, T_STRING);
|
|
123
|
-
if (!
|
|
123
|
+
if (!git_remote_supported_url(StringValueCStr(rb_url)))
|
|
124
124
|
rb_raise(rb_eArgError, "Invalid URL format");
|
|
125
125
|
}
|
|
126
126
|
|
data/ext/rugged/rugged_cred.c
CHANGED
|
@@ -88,19 +88,42 @@ static void rugged_cred_extract_default(git_cred **cred, VALUE rb_credential)
|
|
|
88
88
|
rugged_exception_check(git_cred_default_new(cred));
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
+
static void rugged_cred_extract_username(git_cred **cred, VALUE rb_credential)
|
|
92
|
+
{
|
|
93
|
+
VALUE rb_username = rb_iv_get(rb_credential, "@username");
|
|
94
|
+
Check_Type(rb_username, T_STRING);
|
|
95
|
+
|
|
96
|
+
rugged_exception_check(git_cred_username_new(cred, StringValueCStr(rb_username)));
|
|
97
|
+
}
|
|
98
|
+
|
|
91
99
|
void rugged_cred_extract(git_cred **cred, int allowed_types, VALUE rb_credential)
|
|
92
100
|
{
|
|
93
101
|
if (rb_obj_is_kind_of(rb_credential, rb_cRuggedCredUserPassword)) {
|
|
102
|
+
if (allowed_types & GIT_CREDTYPE_USERNAME) {
|
|
103
|
+
rugged_cred_extract_username(cred, rb_credential);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
|
|
94
107
|
if (!(allowed_types & GIT_CREDTYPE_USERPASS_PLAINTEXT))
|
|
95
108
|
rb_raise(rb_eArgError, "Invalid credential type");
|
|
96
109
|
|
|
97
110
|
rugged_cred_extract_userpass(cred, rb_credential);
|
|
98
111
|
} else if (rb_obj_is_kind_of(rb_credential, rb_cRuggedCredSshKey)) {
|
|
112
|
+
if (allowed_types & GIT_CREDTYPE_USERNAME) {
|
|
113
|
+
rugged_cred_extract_username(cred, rb_credential);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
|
|
99
117
|
if (!(allowed_types & GIT_CREDTYPE_SSH_KEY))
|
|
100
118
|
rb_raise(rb_eArgError, "Invalid credential type");
|
|
101
119
|
|
|
102
120
|
rugged_cred_extract_ssh_key(cred, rb_credential);
|
|
103
121
|
} else if (rb_obj_is_kind_of(rb_credential, rb_cRuggedCredSshKeyFromAgent)) {
|
|
122
|
+
if (allowed_types & GIT_CREDTYPE_USERNAME) {
|
|
123
|
+
rugged_cred_extract_username(cred, rb_credential);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
|
|
104
127
|
if (!(allowed_types & GIT_CREDTYPE_SSH_KEY))
|
|
105
128
|
rb_raise(rb_eArgError, "Invalid credential type");
|
|
106
129
|
|
data/ext/rugged/rugged_index.c
CHANGED
|
@@ -681,6 +681,10 @@ static VALUE rb_git_index_readtree(VALUE self, VALUE rb_tree)
|
|
|
681
681
|
Data_Get_Struct(self, git_index, index);
|
|
682
682
|
Data_Get_Struct(rb_tree, git_tree, tree);
|
|
683
683
|
|
|
684
|
+
if (!rb_obj_is_kind_of(rb_tree, rb_cRuggedTree)) {
|
|
685
|
+
rb_raise(rb_eTypeError, "A Rugged::Tree instance is required");
|
|
686
|
+
}
|
|
687
|
+
|
|
684
688
|
error = git_index_read_tree(index, tree);
|
|
685
689
|
rugged_exception_check(error);
|
|
686
690
|
|
|
@@ -831,7 +835,7 @@ static VALUE rb_git_index_diff(int argc, VALUE *argv, VALUE self)
|
|
|
831
835
|
xfree(opts.pathspec.strings);
|
|
832
836
|
rugged_exception_check(error);
|
|
833
837
|
|
|
834
|
-
return rugged_diff_new(rb_cRuggedDiff,
|
|
838
|
+
return rugged_diff_new(rb_cRuggedDiff, owner, diff);
|
|
835
839
|
}
|
|
836
840
|
|
|
837
841
|
/*
|
data/ext/rugged/rugged_remote.c
CHANGED
|
@@ -535,6 +535,73 @@ static VALUE rb_git_remote_rename(VALUE self, VALUE rb_new_name)
|
|
|
535
535
|
return rb_result;
|
|
536
536
|
}
|
|
537
537
|
|
|
538
|
+
/*
|
|
539
|
+
* call-seq:
|
|
540
|
+
* remote.check_connection(direction, options = {}) -> boolean
|
|
541
|
+
*
|
|
542
|
+
* Try to connect to the +remote+. Useful to simulate
|
|
543
|
+
* <tt>git fetch --dry-run</tt> and <tt>git push --dry-run</tt>.
|
|
544
|
+
*
|
|
545
|
+
* Returns +true+ if connection is successful, +false+ otherwise.
|
|
546
|
+
*
|
|
547
|
+
* +direction+ must be either +:fetch+ or +:push+.
|
|
548
|
+
*
|
|
549
|
+
* The following options can be passed in the +options+ Hash:
|
|
550
|
+
*
|
|
551
|
+
* +credentials+ ::
|
|
552
|
+
* The credentials to use for the connection. Can be either an instance of
|
|
553
|
+
* one of the Rugged::Credentials types, or a proc returning one of the
|
|
554
|
+
* former.
|
|
555
|
+
* The proc will be called with the +url+, the +username+ from the url (if
|
|
556
|
+
* applicable) and a list of applicable credential types.
|
|
557
|
+
*
|
|
558
|
+
* Example:
|
|
559
|
+
*
|
|
560
|
+
* remote = repo.remotes["origin"]
|
|
561
|
+
* success = remote.check_connection(:fetch)
|
|
562
|
+
* raise Error("Unable to pull without credentials") unless success
|
|
563
|
+
*/
|
|
564
|
+
static VALUE rb_git_remote_check_connection(int argc, VALUE *argv, VALUE self)
|
|
565
|
+
{
|
|
566
|
+
git_remote *remote;
|
|
567
|
+
git_remote_callbacks callbacks = GIT_REMOTE_CALLBACKS_INIT;
|
|
568
|
+
struct rugged_remote_cb_payload payload = { Qnil, Qnil, Qnil, Qnil, Qnil, 0 };
|
|
569
|
+
VALUE rb_direction, rb_options;
|
|
570
|
+
ID id_direction;
|
|
571
|
+
int error, direction;
|
|
572
|
+
|
|
573
|
+
Data_Get_Struct(self, git_remote, remote);
|
|
574
|
+
rb_scan_args(argc, argv, "01:", &rb_direction, &rb_options);
|
|
575
|
+
|
|
576
|
+
Check_Type(rb_direction, T_SYMBOL);
|
|
577
|
+
id_direction = SYM2ID(rb_direction);
|
|
578
|
+
if (id_direction == rb_intern("fetch"))
|
|
579
|
+
direction = GIT_DIRECTION_FETCH;
|
|
580
|
+
else if (id_direction == rb_intern("push"))
|
|
581
|
+
direction = GIT_DIRECTION_PUSH;
|
|
582
|
+
else
|
|
583
|
+
rb_raise(rb_eTypeError, "Invalid direction. Expected :fetch or :push");
|
|
584
|
+
|
|
585
|
+
if (!NIL_P(rb_options))
|
|
586
|
+
rugged_remote_init_callbacks_and_payload_from_options(rb_options, &callbacks, &payload);
|
|
587
|
+
|
|
588
|
+
if ((error = git_remote_set_callbacks(remote, &callbacks)) < 0)
|
|
589
|
+
goto cleanup;
|
|
590
|
+
|
|
591
|
+
if (git_remote_connect(remote, direction))
|
|
592
|
+
return Qfalse;
|
|
593
|
+
else {
|
|
594
|
+
git_remote_disconnect(remote);
|
|
595
|
+
return Qtrue;
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
cleanup:
|
|
599
|
+
if (payload.exception)
|
|
600
|
+
rb_jump_tag(payload.exception);
|
|
601
|
+
rugged_exception_check(error);
|
|
602
|
+
return Qfalse;
|
|
603
|
+
}
|
|
604
|
+
|
|
538
605
|
/*
|
|
539
606
|
* call-seq:
|
|
540
607
|
* remote.fetch(refspecs = nil, options = {}) -> hash
|
|
@@ -827,6 +894,7 @@ void Init_rugged_remote(void)
|
|
|
827
894
|
rb_define_method(rb_cRuggedRemote, "add_fetch", rb_git_remote_add_fetch, 1);
|
|
828
895
|
rb_define_method(rb_cRuggedRemote, "add_push", rb_git_remote_add_push, 1);
|
|
829
896
|
rb_define_method(rb_cRuggedRemote, "ls", rb_git_remote_ls, -1);
|
|
897
|
+
rb_define_method(rb_cRuggedRemote, "check_connection", rb_git_remote_check_connection, -1);
|
|
830
898
|
rb_define_method(rb_cRuggedRemote, "fetch", rb_git_remote_fetch, -1);
|
|
831
899
|
rb_define_method(rb_cRuggedRemote, "push", rb_git_remote_push, -1);
|
|
832
900
|
rb_define_method(rb_cRuggedRemote, "clear_refspecs", rb_git_remote_clear_refspecs, 0);
|
data/ext/rugged/rugged_repo.c
CHANGED
|
@@ -643,9 +643,10 @@ static VALUE rb_git_repo_merge_commits(int argc, VALUE *argv, VALUE self)
|
|
|
643
643
|
* repo.exists?(oid) -> true or false
|
|
644
644
|
*
|
|
645
645
|
* Return whether an object with the given SHA1 OID (represented as
|
|
646
|
-
* a
|
|
646
|
+
* a hex string of at least 7 characters) exists in the repository.
|
|
647
647
|
*
|
|
648
648
|
* repo.include?("d8786bfc97485e8d7b19b21fb88c8ef1f199fc3f") #=> true
|
|
649
|
+
* repo.include?("d8786bfc") #=> true
|
|
649
650
|
*/
|
|
650
651
|
static VALUE rb_git_repo_exists(VALUE self, VALUE hex)
|
|
651
652
|
{
|
|
@@ -653,21 +654,23 @@ static VALUE rb_git_repo_exists(VALUE self, VALUE hex)
|
|
|
653
654
|
git_odb *odb;
|
|
654
655
|
git_oid oid;
|
|
655
656
|
int error;
|
|
656
|
-
VALUE rb_result;
|
|
657
657
|
|
|
658
658
|
Data_Get_Struct(self, git_repository, repo);
|
|
659
659
|
Check_Type(hex, T_STRING);
|
|
660
660
|
|
|
661
|
-
error =
|
|
661
|
+
error = git_oid_fromstrn(&oid, RSTRING_PTR(hex), RSTRING_LEN(hex));
|
|
662
662
|
rugged_exception_check(error);
|
|
663
663
|
|
|
664
664
|
error = git_repository_odb(&odb, repo);
|
|
665
665
|
rugged_exception_check(error);
|
|
666
666
|
|
|
667
|
-
|
|
667
|
+
error = git_odb_exists_prefix(NULL, odb, &oid, RSTRING_LEN(hex));
|
|
668
668
|
git_odb_free(odb);
|
|
669
669
|
|
|
670
|
-
|
|
670
|
+
if (error == 0 || error == GIT_EAMBIGUOUS)
|
|
671
|
+
return Qtrue;
|
|
672
|
+
|
|
673
|
+
return Qfalse;
|
|
671
674
|
}
|
|
672
675
|
|
|
673
676
|
/*
|
|
@@ -736,6 +739,107 @@ static VALUE rb_git_repo_read_header(VALUE self, VALUE hex)
|
|
|
736
739
|
return rb_hash;
|
|
737
740
|
}
|
|
738
741
|
|
|
742
|
+
/**
|
|
743
|
+
* call-seq:
|
|
744
|
+
* repo.expand_oids([oid..], object_type = :any) -> hash
|
|
745
|
+
*
|
|
746
|
+
* Expand a list of short oids to their full value, assuming they exist
|
|
747
|
+
* in the repository. If `object_type` is passed, OIDs are expected to be
|
|
748
|
+
* of the given type.
|
|
749
|
+
*
|
|
750
|
+
* Returns a hash of `{ short_oid => full_oid }` for the short OIDs which
|
|
751
|
+
* exist in the repository and match the expected object type. Missing OIDs
|
|
752
|
+
* will not appear in the resulting hash.
|
|
753
|
+
*/
|
|
754
|
+
static VALUE rb_git_repo_expand_oids(int argc, VALUE *argv, VALUE self)
|
|
755
|
+
{
|
|
756
|
+
VALUE rb_result, rb_oids, rb_expected_type;
|
|
757
|
+
|
|
758
|
+
git_otype expected_type = GIT_OBJ_ANY;
|
|
759
|
+
|
|
760
|
+
git_repository *repo;
|
|
761
|
+
git_oid oid;
|
|
762
|
+
git_odb *odb;
|
|
763
|
+
int i, error;
|
|
764
|
+
|
|
765
|
+
Data_Get_Struct(self, git_repository, repo);
|
|
766
|
+
|
|
767
|
+
rb_scan_args(argc, argv, "11", &rb_oids, &rb_expected_type);
|
|
768
|
+
|
|
769
|
+
Check_Type(rb_oids, T_ARRAY);
|
|
770
|
+
expected_type = rugged_otype_get(rb_expected_type);
|
|
771
|
+
|
|
772
|
+
error = git_repository_odb(&odb, repo);
|
|
773
|
+
rugged_exception_check(error);
|
|
774
|
+
|
|
775
|
+
rb_result = rb_hash_new();
|
|
776
|
+
|
|
777
|
+
for (i = 0; i < RARRAY_LEN(rb_oids); ++i) {
|
|
778
|
+
VALUE hex_oid = rb_ary_entry(rb_oids, i);
|
|
779
|
+
git_oid found_oid;
|
|
780
|
+
|
|
781
|
+
if (TYPE(hex_oid) != T_STRING) {
|
|
782
|
+
git_odb_free(odb);
|
|
783
|
+
rb_raise(rb_eTypeError, "Expected a SHA1 OID");
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
error = git_oid_fromstrn(&oid, RSTRING_PTR(hex_oid), RSTRING_LEN(hex_oid));
|
|
787
|
+
if (error < 0) {
|
|
788
|
+
git_odb_free(odb);
|
|
789
|
+
rugged_exception_check(error);
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
error = git_odb_exists_prefix(&found_oid, odb, &oid, RSTRING_LEN(hex_oid));
|
|
793
|
+
|
|
794
|
+
if (!error) {
|
|
795
|
+
if (expected_type != GIT_OBJ_ANY) {
|
|
796
|
+
size_t found_size;
|
|
797
|
+
git_otype found_type;
|
|
798
|
+
|
|
799
|
+
if (git_odb_read_header(&found_size, &found_type, odb, &found_oid) < 0)
|
|
800
|
+
continue;
|
|
801
|
+
|
|
802
|
+
if (found_type != expected_type)
|
|
803
|
+
continue;
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
rb_hash_aset(rb_result, hex_oid, rugged_create_oid(&found_oid));
|
|
807
|
+
}
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
git_odb_free(odb);
|
|
811
|
+
return rb_result;
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
/*
|
|
815
|
+
* call-seq:
|
|
816
|
+
* repo.descendant_of?(commit, ancestor) -> true or false
|
|
817
|
+
*
|
|
818
|
+
* +commit+ and +ancestor+ must be String commit OIDs or instances of Rugged::Commit.
|
|
819
|
+
*
|
|
820
|
+
* Returns true if +commit+ is a descendant of +ancestor+, or false if not.
|
|
821
|
+
*/
|
|
822
|
+
static VALUE rb_git_repo_descendant_of(VALUE self, VALUE rb_commit, VALUE rb_ancestor)
|
|
823
|
+
{
|
|
824
|
+
int result;
|
|
825
|
+
int error;
|
|
826
|
+
git_repository *repo;
|
|
827
|
+
git_oid commit, ancestor;
|
|
828
|
+
|
|
829
|
+
Data_Get_Struct(self, git_repository, repo);
|
|
830
|
+
|
|
831
|
+
error = rugged_oid_get(&commit, repo, rb_commit);
|
|
832
|
+
rugged_exception_check(error);
|
|
833
|
+
|
|
834
|
+
error = rugged_oid_get(&ancestor, repo, rb_ancestor);
|
|
835
|
+
rugged_exception_check(error);
|
|
836
|
+
|
|
837
|
+
result = git_graph_descendant_of(repo, &commit, &ancestor);
|
|
838
|
+
rugged_exception_check(result);
|
|
839
|
+
|
|
840
|
+
return result ? Qtrue : Qfalse;
|
|
841
|
+
}
|
|
842
|
+
|
|
739
843
|
/*
|
|
740
844
|
* call-seq:
|
|
741
845
|
* Repository.hash_data(str, type) -> oid
|
|
@@ -1924,6 +2028,179 @@ static VALUE rb_git_repo_is_path_ignored(VALUE self, VALUE rb_path) {
|
|
|
1924
2028
|
return ignored ? Qtrue : Qfalse;
|
|
1925
2029
|
}
|
|
1926
2030
|
|
|
2031
|
+
static void rugged_parse_cherrypick_options(git_cherrypick_options *opts, VALUE rb_options)
|
|
2032
|
+
{
|
|
2033
|
+
VALUE rb_value;
|
|
2034
|
+
|
|
2035
|
+
if (NIL_P(rb_options))
|
|
2036
|
+
return;
|
|
2037
|
+
|
|
2038
|
+
Check_Type(rb_options, T_HASH);
|
|
2039
|
+
|
|
2040
|
+
rb_value = rb_hash_aref(rb_options, CSTR2SYM("mainline"));
|
|
2041
|
+
if (!NIL_P(rb_value)) {
|
|
2042
|
+
opts->mainline = FIX2UINT(rb_value);
|
|
2043
|
+
}
|
|
2044
|
+
}
|
|
2045
|
+
|
|
2046
|
+
static VALUE rugged_create_attr(const char *attr)
|
|
2047
|
+
{
|
|
2048
|
+
switch (git_attr_value(attr)) {
|
|
2049
|
+
case GIT_ATTR_TRUE_T:
|
|
2050
|
+
return Qtrue;
|
|
2051
|
+
|
|
2052
|
+
case GIT_ATTR_FALSE_T:
|
|
2053
|
+
return Qfalse;
|
|
2054
|
+
|
|
2055
|
+
case GIT_ATTR_VALUE_T:
|
|
2056
|
+
return rb_str_new2(attr);
|
|
2057
|
+
|
|
2058
|
+
case GIT_ATTR_UNSPECIFIED_T:
|
|
2059
|
+
default:
|
|
2060
|
+
return Qnil;
|
|
2061
|
+
}
|
|
2062
|
+
}
|
|
2063
|
+
|
|
2064
|
+
static int foreach_attr_hash(const char *name, const char *value, void *payload)
|
|
2065
|
+
{
|
|
2066
|
+
VALUE rb_hash = (VALUE)payload;
|
|
2067
|
+
rb_hash_aset(rb_hash, rb_str_new2(name), rugged_create_attr(value));
|
|
2068
|
+
return 0;
|
|
2069
|
+
}
|
|
2070
|
+
|
|
2071
|
+
static VALUE rb_git_repo_attributes(int argc, VALUE *argv, VALUE self)
|
|
2072
|
+
{
|
|
2073
|
+
VALUE rb_path, rb_names, rb_options;
|
|
2074
|
+
|
|
2075
|
+
git_repository *repo;
|
|
2076
|
+
int error, options = 0;
|
|
2077
|
+
|
|
2078
|
+
rb_scan_args(argc, argv, "12", &rb_path, &rb_names, &rb_options);
|
|
2079
|
+
|
|
2080
|
+
Data_Get_Struct(self, git_repository, repo);
|
|
2081
|
+
Check_Type(rb_path, T_STRING);
|
|
2082
|
+
|
|
2083
|
+
if (!NIL_P(rb_options)) {
|
|
2084
|
+
Check_Type(rb_options, T_FIXNUM);
|
|
2085
|
+
options = FIX2INT(rb_options);
|
|
2086
|
+
}
|
|
2087
|
+
|
|
2088
|
+
switch (TYPE(rb_names)) {
|
|
2089
|
+
case T_ARRAY:
|
|
2090
|
+
{
|
|
2091
|
+
VALUE rb_result;
|
|
2092
|
+
const char **values;
|
|
2093
|
+
const char **names;
|
|
2094
|
+
int i, num_attr = RARRAY_LEN(rb_names);
|
|
2095
|
+
|
|
2096
|
+
if (num_attr > 32)
|
|
2097
|
+
rb_raise(rb_eRuntimeError, "Too many attributes requested");
|
|
2098
|
+
|
|
2099
|
+
values = alloca(num_attr * sizeof(const char *));
|
|
2100
|
+
names = alloca(num_attr * sizeof(const char *));
|
|
2101
|
+
|
|
2102
|
+
for (i = 0; i < num_attr; ++i) {
|
|
2103
|
+
VALUE attr = rb_ary_entry(rb_names, i);
|
|
2104
|
+
Check_Type(attr, T_STRING);
|
|
2105
|
+
names[i] = StringValueCStr(attr);
|
|
2106
|
+
}
|
|
2107
|
+
|
|
2108
|
+
error = git_attr_get_many(
|
|
2109
|
+
values, repo, options,
|
|
2110
|
+
StringValueCStr(rb_path),
|
|
2111
|
+
(size_t)num_attr, names);
|
|
2112
|
+
|
|
2113
|
+
rugged_exception_check(error);
|
|
2114
|
+
|
|
2115
|
+
rb_result = rb_hash_new();
|
|
2116
|
+
for (i = 0; i < num_attr; ++i) {
|
|
2117
|
+
VALUE attr = rb_ary_entry(rb_names, i);
|
|
2118
|
+
rb_hash_aset(rb_result, attr, rugged_create_attr(values[i]));
|
|
2119
|
+
}
|
|
2120
|
+
return rb_result;
|
|
2121
|
+
}
|
|
2122
|
+
|
|
2123
|
+
case T_STRING:
|
|
2124
|
+
{
|
|
2125
|
+
const char *value;
|
|
2126
|
+
|
|
2127
|
+
error = git_attr_get(
|
|
2128
|
+
&value, repo, options,
|
|
2129
|
+
StringValueCStr(rb_path),
|
|
2130
|
+
StringValueCStr(rb_names));
|
|
2131
|
+
|
|
2132
|
+
rugged_exception_check(error);
|
|
2133
|
+
|
|
2134
|
+
return rugged_create_attr(value);
|
|
2135
|
+
}
|
|
2136
|
+
|
|
2137
|
+
case T_NIL:
|
|
2138
|
+
{
|
|
2139
|
+
VALUE rb_result = rb_hash_new();
|
|
2140
|
+
|
|
2141
|
+
error = git_attr_foreach(
|
|
2142
|
+
repo, options,
|
|
2143
|
+
StringValueCStr(rb_path),
|
|
2144
|
+
&foreach_attr_hash,
|
|
2145
|
+
(void *)rb_result);
|
|
2146
|
+
|
|
2147
|
+
rugged_exception_check(error);
|
|
2148
|
+
return rb_result;
|
|
2149
|
+
}
|
|
2150
|
+
|
|
2151
|
+
default:
|
|
2152
|
+
rb_raise(rb_eTypeError,
|
|
2153
|
+
"Invalid attribute name (expected String or Array)");
|
|
2154
|
+
}
|
|
2155
|
+
}
|
|
2156
|
+
|
|
2157
|
+
/*
|
|
2158
|
+
* call-seq:
|
|
2159
|
+
* repo.cherrypick(commit[, options]) -> nil
|
|
2160
|
+
*
|
|
2161
|
+
* Cherry-pick the given commit and update the index and working
|
|
2162
|
+
* directory accordingly.
|
|
2163
|
+
*
|
|
2164
|
+
* `commit` can be either a string containing a commit id or a
|
|
2165
|
+
* `Rugged::Commit` object.
|
|
2166
|
+
*
|
|
2167
|
+
* The following options can be passed in the +options+ Hash:
|
|
2168
|
+
*
|
|
2169
|
+
* :mainline ::
|
|
2170
|
+
* When cherry-picking a merge, you need to specify the parent number
|
|
2171
|
+
* (starting from 1) which should be considered the mainline.
|
|
2172
|
+
*/
|
|
2173
|
+
static VALUE rb_git_repo_cherrypick(int argc, VALUE *argv, VALUE self)
|
|
2174
|
+
{
|
|
2175
|
+
VALUE rb_options, rb_commit;
|
|
2176
|
+
|
|
2177
|
+
git_repository *repo;
|
|
2178
|
+
git_commit *commit;
|
|
2179
|
+
git_cherrypick_options opts = GIT_CHERRYPICK_OPTIONS_INIT;
|
|
2180
|
+
|
|
2181
|
+
int error;
|
|
2182
|
+
|
|
2183
|
+
rb_scan_args(argc, argv, "10:", &rb_commit, &rb_options);
|
|
2184
|
+
|
|
2185
|
+
if (TYPE(rb_commit) == T_STRING) {
|
|
2186
|
+
rb_commit = rugged_object_rev_parse(self, rb_commit, 1);
|
|
2187
|
+
}
|
|
2188
|
+
|
|
2189
|
+
if (!rb_obj_is_kind_of(rb_commit, rb_cRuggedCommit)) {
|
|
2190
|
+
rb_raise(rb_eArgError, "Expected a Rugged::Commit.");
|
|
2191
|
+
}
|
|
2192
|
+
|
|
2193
|
+
Data_Get_Struct(self, git_repository, repo);
|
|
2194
|
+
Data_Get_Struct(rb_commit, git_commit, commit);
|
|
2195
|
+
|
|
2196
|
+
rugged_parse_cherrypick_options(&opts, rb_options);
|
|
2197
|
+
|
|
2198
|
+
error = git_cherrypick(repo, commit, &opts);
|
|
2199
|
+
rugged_exception_check(error);
|
|
2200
|
+
|
|
2201
|
+
return Qnil;
|
|
2202
|
+
}
|
|
2203
|
+
|
|
1927
2204
|
void Init_rugged_repo(void)
|
|
1928
2205
|
{
|
|
1929
2206
|
id_call = rb_intern("call");
|
|
@@ -1942,6 +2219,8 @@ void Init_rugged_repo(void)
|
|
|
1942
2219
|
|
|
1943
2220
|
rb_define_method(rb_cRuggedRepo, "exists?", rb_git_repo_exists, 1);
|
|
1944
2221
|
rb_define_method(rb_cRuggedRepo, "include?", rb_git_repo_exists, 1);
|
|
2222
|
+
rb_define_method(rb_cRuggedRepo, "expand_oids", rb_git_repo_expand_oids, -1);
|
|
2223
|
+
rb_define_method(rb_cRuggedRepo, "descendant_of?", rb_git_repo_descendant_of, 2);
|
|
1945
2224
|
|
|
1946
2225
|
rb_define_method(rb_cRuggedRepo, "read", rb_git_repo_read, 1);
|
|
1947
2226
|
rb_define_method(rb_cRuggedRepo, "read_header", rb_git_repo_read_header, 1);
|
|
@@ -1986,6 +2265,9 @@ void Init_rugged_repo(void)
|
|
|
1986
2265
|
rb_define_method(rb_cRuggedRepo, "checkout_tree", rb_git_checkout_tree, -1);
|
|
1987
2266
|
rb_define_method(rb_cRuggedRepo, "checkout_head", rb_git_checkout_head, -1);
|
|
1988
2267
|
|
|
2268
|
+
rb_define_method(rb_cRuggedRepo, "cherrypick", rb_git_repo_cherrypick, -1);
|
|
2269
|
+
rb_define_method(rb_cRuggedRepo, "fetch_attributes", rb_git_repo_attributes, -1);
|
|
2270
|
+
|
|
1989
2271
|
rb_cRuggedOdbObject = rb_define_class_under(rb_mRugged, "OdbObject", rb_cObject);
|
|
1990
2272
|
rb_define_method(rb_cRuggedOdbObject, "data", rb_git_odbobj_data, 0);
|
|
1991
2273
|
rb_define_method(rb_cRuggedOdbObject, "len", rb_git_odbobj_size, 0);
|