Skip to content

Commit b826f49

Browse files
committed
Save GitConfig to file using Save()
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
1 parent 5a23ce4 commit b826f49

File tree

2 files changed

+63
-0
lines changed

2 files changed

+63
-0
lines changed

git-config.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package goconfig
22

33
import (
44
"fmt"
5+
"io/ioutil"
6+
"os"
57
"reflect"
68
"sort"
79
"strconv"
@@ -407,3 +409,22 @@ func (v GitConfig) StringOfScope(scope Scope) string {
407409
}
408410
return strings.Join(lines, "\n") + "\n"
409411
}
412+
413+
// Save will save git config to file
414+
func (v GitConfig) Save(file string) error {
415+
lockFile := file + ".lock"
416+
417+
err := ioutil.WriteFile(lockFile, []byte(v.String()), 0644)
418+
defer os.Remove(lockFile)
419+
420+
if err != nil {
421+
return err
422+
}
423+
424+
_, err = LoadFile(lockFile, false)
425+
if err != nil {
426+
return fmt.Errorf("fail to save '%s': %s", file, err)
427+
}
428+
429+
return os.Rename(lockFile, file)
430+
}

load_test.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,3 +316,45 @@ func TestAllConfig(t *testing.T) {
316316
assert.Equal("repo 4", allConfig.Get("test.key4"))
317317
assert.Equal("repo 5", allConfig.Get("test.key5"))
318318
}
319+
320+
func TestSaveConfig(t *testing.T) {
321+
assert := assert.New(t)
322+
323+
tmpdir, err := ioutil.TempDir("", "goconfig")
324+
if err != nil {
325+
panic(err)
326+
}
327+
defer func(dir string) {
328+
os.RemoveAll(dir)
329+
}(tmpdir)
330+
331+
home := os.Getenv("HOME")
332+
os.Setenv("HOME", tmpdir)
333+
defer os.Setenv("HOME", home)
334+
335+
// Create system config
336+
cfgFile := filepath.Join(tmpdir, "gitconfig")
337+
338+
assert.Nil(exec.Command("git", "config", "-f", cfgFile, "ab.cd.ef", "value-1").Run())
339+
assert.Nil(exec.Command("git", "config", "-f", cfgFile, "ab.cd e.fg", "value 2").Run())
340+
assert.Nil(exec.Command("git", "config", "-f", cfgFile, "--add", "ab.cd e.fg", "value 3").Run())
341+
assert.Nil(exec.Command("git", "config", "-f", cfgFile, "--add", "ab.cd e.fg", "value 4").Run())
342+
assert.Nil(exec.Command("git", "config", "-f", cfgFile, "ab.cd", "value has space ").Run())
343+
344+
// Load cfgFile
345+
cfg, err := LoadFile(cfgFile, false)
346+
assert.Nil(err)
347+
assert.Equal("value has space ", cfg.Get("ab.cd"))
348+
349+
// Save file
350+
newCfgFile := cfgFile + ".new"
351+
err = cfg.Save(newCfgFile)
352+
assert.Nil(err)
353+
_, err = os.Stat(newCfgFile)
354+
assert.Nil(err)
355+
356+
// Load new file
357+
newCfg, err := LoadFile(newCfgFile, false)
358+
assert.Nil(err)
359+
assert.Equal(cfg, newCfg)
360+
}

0 commit comments

Comments
 (0)