Skip to content

Add Rugged::Config#add - #834

Open
codenamev wants to merge 1 commit into
libgit2:masterfrom
codenamev:config-add
Open

Add Rugged::Config#add#834
codenamev wants to merge 1 commit into
libgit2:masterfrom
codenamev:config-add

Conversation

@codenamev

Copy link
Copy Markdown

This method allows you to set multiple values for the same key in a
particular config, similar to git config --add "include.path" some/path.

For example, I have a git config with an existing include.path value:

$ cat ~/src/opensource/rugged/.git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[remote "origin"]
url = git@github.com:codenamev/rugged.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[submodule "vendor/libgit2"]
active = true
url = https://github.com/libgit2/libgit2.git
[include]
path = /Users/codenamev/.gitconfig.reflow

With Rugged::Config#add I can set another value for include.path
without overwriting the existing value:

ruby -I lib -rrugged -e'\
config = Rugged::Repository.new("/Users/codenamev/src/opensource/rugged").config;
config.add("include.path", "/Users/codenamev/.gitconfig.extras");
p config.get_all("include.path")'
["/Users/codenamev/.gitconfig.reflow", "/Users/codenamev/.gitconfig.extras"]

References #725

} else if (RB_TYPE_P(rb_val, T_TRUE) || RB_TYPE_P(rb_val, T_FALSE)) {
error = git_config_set_multivar(config, key, "$^", (rb_val == Qtrue) ? "true" : "false");
} else if (FIXNUM_P(rb_val)) {
char str_value[32];

@codenamevcodenamevMar 6, 2020

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I took this snippet from the libgit2 source. I'm not entirely sure this is the best way to do this conversion, but I figured I'd at least mimic the behavior. There are some performance enhancements related to windows systems for snprintf that were not ported over (because I have no idea how that works).

This method allows you to set multiple values for the same key in a
particular config, similar to `git config --add "include.path" some/path`.
For example, I have a git config with an existing `include.path` value:
```
$ cat ~/src/opensource/rugged/.git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[remote "origin"]
url = git@github.com:codenamev/rugged.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[submodule "vendor/libgit2"]
active = true
url = https://github.com/libgit2/libgit2.git
[include]
path = /Users/codenamev/.gitconfig.reflow
```
With `Rugged::Config#add` I can set another value for `include.path`
without overwriting the existing value:
```
ruby -I lib -rrugged -e'\
config = Rugged::Repository.new("/Users/codenamev/src/opensource/rugged").config;
config.add("include.path", "/Users/codenamev/.gitconfig.extras");
p config.get_all("include.path")'
["/Users/codenamev/.gitconfig.reflow", "/Users/codenamev/.gitconfig.extras"]
```
References libgit2#725
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@codenamev@scutuatua-crypto