Skip to content

Commit 0e77174

Browse files
committed
Added AddRepository function
1 parent 890ad35 commit 0e77174

File tree

3 files changed

+67
-0
lines changed

3 files changed

+67
-0
lines changed

repos.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"bytes"
2424
"fmt"
2525
"io/ioutil"
26+
"os"
2627
"path/filepath"
2728
"regexp"
2829
"strings"
@@ -160,3 +161,31 @@ func ParseAPTConfigFolder(folderPath string) (RepositoryList, error) {
160161
}
161162
return res, nil
162163
}
164+
165+
// AddRepository adds the specified repository to the specified APT
166+
// config folder (usually /etc/apt). The new repository is saved into
167+
// a file named "managed.list"
168+
func AddRepository(repo *Repository, configFolderPath string) error {
169+
repos, err := ParseAPTConfigFolder(configFolderPath)
170+
if err != nil {
171+
return fmt.Errorf("parsing APT config: %s", err)
172+
}
173+
if repos.Contains(repo) {
174+
return fmt.Errorf("The repository is already configured")
175+
}
176+
177+
// Add to the "managed.list" file
178+
managedPath := filepath.Join(configFolderPath, "sources.list.d", "managed.list")
179+
f, err := os.OpenFile(managedPath, os.O_APPEND|os.O_WRONLY, 0644)
180+
if os.IsNotExist(err) {
181+
f, err = os.OpenFile(managedPath, os.O_CREATE|os.O_WRONLY, 0644)
182+
}
183+
if err != nil {
184+
return fmt.Errorf("Opening %s: %s", managedPath, err)
185+
}
186+
defer f.Close()
187+
if _, err = f.WriteString(repo.APTConfigLine() + "\n"); err != nil {
188+
return fmt.Errorf("Writing repo data to config file %s: %s", managedPath, err)
189+
}
190+
return nil
191+
}

repos_test.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ package apt
2121
import (
2222
"encoding/json"
2323
"io/ioutil"
24+
"os"
2425
"testing"
2526

2627
"github.com/stretchr/testify/require"
@@ -40,3 +41,37 @@ func TestParseAPTConfigFolder(t *testing.T) {
4041
require.EqualValues(t, expected[i], repo, "Comparing element %d", i)
4142
}
4243
}
44+
45+
func TestAddRepository(t *testing.T) {
46+
// test cleanup
47+
defer os.Remove("testdata/apt2/sources.list.d/managed.list")
48+
49+
repo1 := &Repository{
50+
Enabled: true,
51+
SourceRepo: false,
52+
URI: "http://ppa.launchpad.net/webupd8team/java/ubuntu",
53+
Distribution: "zesty",
54+
Components: "main",
55+
Comment: "",
56+
}
57+
repo2 := &Repository{
58+
Enabled: false,
59+
SourceRepo: true,
60+
URI: "http://ppa.launchpad.net/webupd8team/java/ubuntu",
61+
Distribution: "zesty",
62+
Components: "main",
63+
Comment: "",
64+
}
65+
err := AddRepository(repo1, "testdata/apt2")
66+
require.NoError(t, err, "Adding repository")
67+
err = AddRepository(repo2, "testdata/apt2")
68+
require.NoError(t, err, "Adding repository")
69+
70+
repos, err := ParseAPTConfigFolder("testdata/apt2")
71+
require.NoError(t, err, "running List command")
72+
require.True(t, repos.Contains(repo1), "Configuration contains: %#v", repo1)
73+
require.True(t, repos.Contains(repo1), "Configuration contains: %#v", repo2)
74+
75+
err = AddRepository(repo2, "testdata/apt2")
76+
require.Error(t, err, "Adding repository again")
77+
}

testdata/apt2/sources.list

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
deb http://it.archive.ubuntu.com/ubuntu/ zesty main restricted
2+
deb-src http://it.archive.ubuntu.com/ubuntu/ zesty main restricted
3+

0 commit comments

Comments
 (0)