Skip to content

Commit c449fc5

Browse files
author
Vicent Marti
committed
Merge pull request #492 from libgit2/arthur/update-submodule-api
Change the Submodule API.
2 parents 549efb0 + c9aa77c commit c449fc5

File tree

3 files changed

+163
-172
lines changed

3 files changed

+163
-172
lines changed

ext/rugged/rugged_submodule.c

Lines changed: 0 additions & 153 deletions
Original file line numberDiff line numberDiff line change
@@ -557,34 +557,6 @@ static VALUE rb_git_submodule_url(VALUE self)
557557
return url ? rb_str_new_utf8(url) : Qnil;
558558
}
559559

560-
/*
561-
* call-seq:
562-
* submodule.url = url -> url
563-
*
564-
* Set the URL in the config for the submodule.
565-
*
566-
* After calling this, #reload can be called to load the new url for
567-
* the submodule and #sync to write the changes to the checked out
568-
* submodule repository.
569-
*/
570-
static VALUE rb_git_submodule_set_url(VALUE self, VALUE rb_url)
571-
{
572-
VALUE rb_repo = rugged_owner(self);
573-
git_repository *repo;
574-
git_submodule *submodule;
575-
576-
rugged_check_repo(rb_repo);
577-
Check_Type(rb_url, T_STRING);
578-
579-
Data_Get_Struct(rb_repo, git_repository, repo);
580-
Data_Get_Struct(self, git_submodule, submodule);
581-
582-
rugged_exception_check(
583-
git_submodule_set_url(repo, git_submodule_name(submodule), StringValueCStr(rb_url))
584-
);
585-
return rb_url;
586-
}
587-
588560
/*
589561
* call-seq:
590562
* submodule.path -> string
@@ -675,33 +647,6 @@ static VALUE rb_git_submodule_fetch_recurse_submodules(VALUE self)
675647
return git_submodule_fetch_recurse_submodules(submodule) ? Qtrue : Qfalse;
676648
}
677649

678-
/*
679-
* call-seq:
680-
* submodule.fetch_recurse_submodules= bool -> bool
681-
*
682-
* Set the +fetchRecurseSubmodules+ rule in the configuration for a submodule.
683-
*
684-
* This sets the <tt>submodule.<name>.fetchRecurseSubmodules</tt> value for
685-
* the submodule. #reload can be called to load the new value.
686-
*/
687-
static VALUE rb_git_submodule_set_fetch_recurse_submodules(VALUE self, VALUE rb_fetch_recursive)
688-
{
689-
VALUE rb_repo = rugged_owner(self);
690-
git_repository *repo;
691-
git_submodule *submodule;
692-
693-
rugged_check_repo(rb_repo);
694-
695-
Data_Get_Struct(rb_repo, git_repository, repo);
696-
Data_Get_Struct(self, git_submodule, submodule);
697-
698-
git_submodule_set_fetch_recurse_submodules(repo,
699-
git_submodule_name(submodule), rugged_parse_bool(rb_fetch_recursive)
700-
);
701-
702-
return rb_fetch_recursive;
703-
}
704-
705650
static VALUE rb_git_subm_ignore_rule_fromC(git_submodule_ignore_t rule)
706651
{
707652
switch(rule) {
@@ -754,53 +699,6 @@ static VALUE rb_git_submodule_ignore_rule(VALUE self)
754699
return rb_git_subm_ignore_rule_fromC(ignore);
755700
}
756701

757-
static git_submodule_ignore_t rb_git_subm_ignore_rule_toC(VALUE rb_ignore_rule)
758-
{
759-
ID id_ignore_rule;
760-
761-
Check_Type(rb_ignore_rule, T_SYMBOL);
762-
id_ignore_rule = SYM2ID(rb_ignore_rule);
763-
764-
if (id_ignore_rule == id_ignore_none) {
765-
return GIT_SUBMODULE_IGNORE_NONE;
766-
} else if (id_ignore_rule == id_ignore_untracked) {
767-
return GIT_SUBMODULE_IGNORE_UNTRACKED;
768-
} else if (id_ignore_rule == id_ignore_dirty) {
769-
return GIT_SUBMODULE_IGNORE_DIRTY;
770-
} else if (id_ignore_rule == id_ignore_all) {
771-
return GIT_SUBMODULE_IGNORE_ALL;
772-
} else {
773-
rb_raise(rb_eArgError, "Invalid submodule ignore rule type.");
774-
}
775-
}
776-
777-
/*
778-
* call-seq:
779-
* submodule.ignore_rule = rule -> rule
780-
*
781-
* Set the ignore_rule to +rule+ in the submodule configuration.
782-
* See #ignore for a list of accepted rules.
783-
*
784-
* Calling #reload will update the submodule to the updated configuration.
785-
*/
786-
static VALUE rb_git_submodule_set_ignore_rule(VALUE self, VALUE rb_ignore_rule)
787-
{
788-
VALUE rb_repo = rugged_owner(self);
789-
git_repository *repo;
790-
git_submodule *submodule;
791-
792-
rugged_check_repo(rb_repo);
793-
794-
Data_Get_Struct(rb_repo, git_repository, repo);
795-
Data_Get_Struct(self, git_submodule, submodule);
796-
797-
git_submodule_set_ignore(repo, git_submodule_name(submodule),
798-
rb_git_subm_ignore_rule_toC(rb_ignore_rule)
799-
);
800-
801-
return rb_ignore_rule;
802-
}
803-
804702
static VALUE rb_git_subm_update_rule_fromC(git_submodule_update_t rule)
805703
{
806704
switch(rule) {
@@ -848,53 +746,6 @@ static VALUE rb_git_submodule_update_rule(VALUE self)
848746
return rb_git_subm_update_rule_fromC(update);
849747
}
850748

851-
static git_submodule_update_t rb_git_subm_update_rule_toC(VALUE rb_update_rule)
852-
{
853-
ID id_update_rule;
854-
855-
Check_Type(rb_update_rule, T_SYMBOL);
856-
id_update_rule = SYM2ID(rb_update_rule);
857-
858-
if (id_update_rule == id_update_checkout) {
859-
return GIT_SUBMODULE_UPDATE_CHECKOUT;
860-
} else if (id_update_rule == id_update_rebase) {
861-
return GIT_SUBMODULE_UPDATE_REBASE;
862-
} else if (id_update_rule == id_update_merge) {
863-
return GIT_SUBMODULE_UPDATE_MERGE;
864-
} else if (id_update_rule == id_update_none) {
865-
return GIT_SUBMODULE_UPDATE_NONE;
866-
} else {
867-
rb_raise(rb_eArgError, "Invalid submodule update rule type.");
868-
}
869-
}
870-
871-
/*
872-
* call-seq:
873-
* submodule.update_rule = rule -> rule
874-
*
875-
* Set the update_rule to +rule+ in the configuration for a submodule.
876-
* See #update_rule for a list of accepted rules.
877-
*
878-
* Changing this setting won't affect the loaded submodule
879-
*/
880-
static VALUE rb_git_submodule_set_update_rule(VALUE self, VALUE rb_update_rule)
881-
{
882-
VALUE rb_repo = rugged_owner(self);
883-
git_repository *repo;
884-
git_submodule *submodule;
885-
886-
rugged_check_repo(rb_repo);
887-
888-
Data_Get_Struct(rb_repo, git_repository, repo);
889-
Data_Get_Struct(self, git_submodule, submodule);
890-
891-
git_submodule_set_update(repo, git_submodule_name(submodule),
892-
rb_git_subm_update_rule_toC(rb_update_rule)
893-
);
894-
895-
return rb_update_rule;
896-
}
897-
898749
/*
899750
* call-seq:
900751
* submodule.repository -> repository
@@ -963,15 +814,11 @@ void Init_rugged_submodule(void)
963814

964815
rb_define_method(rb_cRuggedSubmodule, "name", rb_git_submodule_name, 0);
965816
rb_define_method(rb_cRuggedSubmodule, "url", rb_git_submodule_url, 0);
966-
rb_define_method(rb_cRuggedSubmodule, "url=", rb_git_submodule_set_url, 1);
967817
rb_define_method(rb_cRuggedSubmodule, "path", rb_git_submodule_path, 0);
968818
rb_define_method(rb_cRuggedSubmodule, "fetch_recurse_submodules?", rb_git_submodule_fetch_recurse_submodules, 0);
969-
rb_define_method(rb_cRuggedSubmodule, "fetch_recurse_submodules=", rb_git_submodule_set_fetch_recurse_submodules, 1);
970819

971820
rb_define_method(rb_cRuggedSubmodule, "ignore_rule", rb_git_submodule_ignore_rule, 0);
972-
rb_define_method(rb_cRuggedSubmodule, "ignore_rule=", rb_git_submodule_set_ignore_rule, 1);
973821
rb_define_method(rb_cRuggedSubmodule, "update_rule", rb_git_submodule_update_rule, 0);
974-
rb_define_method(rb_cRuggedSubmodule, "update_rule=", rb_git_submodule_set_update_rule, 1);
975822

976823
rb_define_method(rb_cRuggedSubmodule, "head_oid", rb_git_submodule_head_id, 0);
977824
rb_define_method(rb_cRuggedSubmodule, "index_oid", rb_git_submodule_index_id, 0);

ext/rugged/rugged_submodule_collection.c

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,151 @@ static VALUE rb_git_submodule_setup_add(int argc, VALUE *argv, VALUE self)
224224
return rugged_submodule_new(rb_repo, submodule);
225225
}
226226

227+
static git_submodule_ignore_t rb_git_subm_ignore_rule_toC(VALUE rb_ignore_rule)
228+
{
229+
ID id_ignore_rule;
230+
231+
Check_Type(rb_ignore_rule, T_SYMBOL);
232+
id_ignore_rule = SYM2ID(rb_ignore_rule);
233+
234+
if (id_ignore_rule == rb_intern("none")) {
235+
return GIT_SUBMODULE_IGNORE_NONE;
236+
} else if (id_ignore_rule == rb_intern("untracked")) {
237+
return GIT_SUBMODULE_IGNORE_UNTRACKED;
238+
} else if (id_ignore_rule == rb_intern("dirty")) {
239+
return GIT_SUBMODULE_IGNORE_DIRTY;
240+
} else if (id_ignore_rule == rb_intern("all")) {
241+
return GIT_SUBMODULE_IGNORE_ALL;
242+
} else {
243+
rb_raise(rb_eArgError, "Invalid submodule ignore rule type.");
244+
}
245+
}
246+
247+
static git_submodule_update_t rb_git_subm_update_rule_toC(VALUE rb_update_rule)
248+
{
249+
ID id_update_rule;
250+
251+
Check_Type(rb_update_rule, T_SYMBOL);
252+
id_update_rule = SYM2ID(rb_update_rule);
253+
254+
if (id_update_rule == rb_intern("checkout")) {
255+
return GIT_SUBMODULE_UPDATE_CHECKOUT;
256+
} else if (id_update_rule == rb_intern("rebase")) {
257+
return GIT_SUBMODULE_UPDATE_REBASE;
258+
} else if (id_update_rule == rb_intern("merge")) {
259+
return GIT_SUBMODULE_UPDATE_MERGE;
260+
} else if (id_update_rule == rb_intern("none")) {
261+
return GIT_SUBMODULE_UPDATE_NONE;
262+
} else {
263+
rb_raise(rb_eArgError, "Invalid submodule update rule type.");
264+
}
265+
}
266+
267+
/*
268+
* call-seq:
269+
* submodules.update(submodule, settings) -> nil
270+
* submodules.update(name, settings) -> nil
271+
*
272+
* Update settings for the given submodule in the submodule config.
273+
*
274+
* Existing `Rugged::Submodule` instances are not updated, but can be
275+
* reloaded by calling `#reload`.
276+
*
277+
* The following options can be passed in the +settings+ Hash:
278+
*
279+
* :url ::
280+
* Updates the URL for the submodule.
281+
*
282+
* :ignore_rule ::
283+
* See `Rugged::Submodule#ignore_rule` for a list of accepted rules.
284+
*
285+
* :update_rule ::
286+
* See `Rugged::Submodule#update_rule` for a list of accepted rules.
287+
*
288+
* :fetch_recurse_submodules ::
289+
* Updates the +fetchRecurseSubmodules+ rule.
290+
*/
291+
static VALUE rb_git_submodule_update(VALUE self, VALUE rb_name_or_submodule, VALUE rb_settings)
292+
{
293+
git_repository *repo;
294+
git_submodule_ignore_t ignore_rule;
295+
git_submodule_update_t update_rule;
296+
const char *submodule_name;
297+
int fetch_recurse_submodules;
298+
VALUE rb_repo = rugged_owner(self);
299+
VALUE rb_url, rb_fetch_recurse_submodules, rb_ignore_rule, rb_update_rule;
300+
301+
rugged_check_repo(rb_repo);
302+
Data_Get_Struct(rb_repo, git_repository, repo);
303+
304+
if (rb_obj_is_kind_of(rb_name_or_submodule, rb_cRuggedSubmodule))
305+
rb_name_or_submodule = rb_funcall(rb_name_or_submodule, rb_intern("name"), 0);
306+
307+
if (TYPE(rb_name_or_submodule) != T_STRING)
308+
rb_raise(rb_eTypeError, "Expecting a String or Rugged::Submodule instance");
309+
310+
rb_url = rb_hash_aref(rb_settings, CSTR2SYM("url"));
311+
rb_fetch_recurse_submodules = rb_hash_aref(rb_settings, CSTR2SYM("fetch_recurse_submodules"));
312+
rb_ignore_rule = rb_hash_aref(rb_settings, CSTR2SYM("ignore_rule"));
313+
rb_update_rule = rb_hash_aref(rb_settings, CSTR2SYM("update_rule"));
314+
315+
if (!NIL_P(rb_url)) {
316+
Check_Type(rb_url, T_STRING);
317+
}
318+
319+
if (!NIL_P(rb_fetch_recurse_submodules)) {
320+
fetch_recurse_submodules = rugged_parse_bool(rb_fetch_recurse_submodules);
321+
}
322+
323+
if (!NIL_P(rb_ignore_rule)) {
324+
ignore_rule = rb_git_subm_ignore_rule_toC(rb_ignore_rule);
325+
}
326+
327+
if (!NIL_P(rb_update_rule)) {
328+
update_rule = rb_git_subm_update_rule_toC(rb_update_rule);
329+
}
330+
331+
submodule_name = StringValueCStr(rb_name_or_submodule);
332+
333+
if (!NIL_P(rb_url)) {
334+
rugged_exception_check(
335+
git_submodule_set_url(repo,
336+
submodule_name,
337+
StringValueCStr(rb_url)
338+
)
339+
);
340+
}
341+
342+
if (!NIL_P(rb_fetch_recurse_submodules)) {
343+
rugged_exception_check(
344+
git_submodule_set_fetch_recurse_submodules(repo,
345+
submodule_name,
346+
fetch_recurse_submodules
347+
)
348+
);
349+
}
350+
351+
if (!NIL_P(rb_ignore_rule)) {
352+
rugged_exception_check(
353+
git_submodule_set_ignore(repo,
354+
submodule_name,
355+
ignore_rule
356+
)
357+
);
358+
}
359+
360+
if (!NIL_P(rb_update_rule)) {
361+
rugged_exception_check(
362+
git_submodule_set_update(repo,
363+
submodule_name,
364+
update_rule
365+
)
366+
);
367+
}
368+
369+
return Qnil;
370+
}
371+
227372
void Init_rugged_submodule_collection(void)
228373
{
229374
rb_cRuggedSubmoduleCollection = rb_define_class_under(rb_mRugged, "SubmoduleCollection", rb_cObject);
@@ -232,5 +377,8 @@ void Init_rugged_submodule_collection(void)
232377
rb_define_method(rb_cRuggedSubmoduleCollection, "initialize", rb_git_submodule_collection_initialize, 1);
233378
rb_define_method(rb_cRuggedSubmoduleCollection, "[]", rb_git_submodule_collection_aref, 1);
234379
rb_define_method(rb_cRuggedSubmoduleCollection, "each", rb_git_submodule_collection_each, 0);
380+
381+
rb_define_method(rb_cRuggedSubmoduleCollection, "update", rb_git_submodule_update, 2);
382+
235383
rb_define_method(rb_cRuggedSubmoduleCollection, "setup_add", rb_git_submodule_setup_add, -1);
236384
}

0 commit comments

Comments
 (0)