Skip to content

Commit 9120d41

Browse files
committed
Added RemoveRepository function
1 parent 9b2bdf4 commit 9120d41

File tree

3 files changed

+71
-1
lines changed

3 files changed

+71
-1
lines changed

repos.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,3 +198,60 @@ func AddRepository(repo *Repository, configFolderPath string) error {
198198
}
199199
return nil
200200
}
201+
202+
// RemoveRepository removes a repository from the repository list files
203+
func RemoveRepository(repo *Repository, configFolderPath string) error {
204+
// Read all repos configurations
205+
repos, err := ParseAPTConfigFolder(configFolderPath)
206+
if err != nil {
207+
return fmt.Errorf("parsing APT config: %s", err)
208+
}
209+
210+
// Find the repo to remove
211+
repoToRemove := repos.Find(repo)
212+
if repoToRemove == nil {
213+
return fmt.Errorf("Repository already removed")
214+
}
215+
216+
// Read the config file that contains the repo config to remove
217+
fileToFilter := repoToRemove.configFile
218+
data, err := ioutil.ReadFile(fileToFilter)
219+
if err != nil {
220+
return fmt.Errorf("Reading config file %s: %s", fileToFilter, err)
221+
}
222+
223+
// Create the new version of the file
224+
f, err := os.OpenFile(fileToFilter+".new", os.O_CREATE|os.O_WRONLY, 0644)
225+
if err != nil {
226+
return fmt.Errorf("Writing of new config %s: %s", fileToFilter+".new", err)
227+
}
228+
scanner := bufio.NewScanner(bytes.NewReader(data))
229+
for scanner.Scan() {
230+
line := scanner.Text()
231+
r := parseAPTConfigLine(line)
232+
if r.Equals(repo) {
233+
// Filter repo configs that match the repo to be removed
234+
continue
235+
}
236+
f.WriteString(line + "\n")
237+
}
238+
f.Close()
239+
// In case of error clean-up the .new copy
240+
defer os.Remove(fileToFilter + ".new")
241+
242+
// Rename .list to .list.save
243+
err = os.Rename(fileToFilter, fileToFilter+".save")
244+
if err != nil {
245+
return fmt.Errorf("Making backup copy of %s: %s", fileToFilter, err)
246+
}
247+
248+
// Rename .list.new to .list
249+
err = os.Rename(fileToFilter+".new", fileToFilter)
250+
if err != nil {
251+
// Try to rollback change...
252+
os.Rename(fileToFilter+".save", fileToFilter)
253+
return fmt.Errorf("Renaming %s to %s: %s", fileToFilter+".new", fileToFilter, err)
254+
}
255+
256+
return nil
257+
}

repos_test.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ func TestParseAPTConfigFolder(t *testing.T) {
4242
}
4343
}
4444

45-
func TestAddRepository(t *testing.T) {
45+
func TestAddAndRemoveRepository(t *testing.T) {
4646
// test cleanup
4747
defer os.Remove("testdata/apt2/sources.list.d/managed.list")
4848

@@ -74,4 +74,15 @@ func TestAddRepository(t *testing.T) {
7474

7575
err = AddRepository(repo2, "testdata/apt2")
7676
require.Error(t, err, "Adding repository again")
77+
78+
err = RemoveRepository(repo2, "testdata/apt2")
79+
require.NoError(t, err, "Removing repository")
80+
81+
repos, err = ParseAPTConfigFolder("testdata/apt2")
82+
require.NoError(t, err, "running List command")
83+
require.True(t, repos.Contains(repo1), "Configuration contains: %#v", repo1)
84+
require.False(t, repos.Contains(repo2), "Configuration contains: %#v", repo2)
85+
86+
err = RemoveRepository(repo2, "testdata/apt2")
87+
require.Error(t, err, "Removing repository again")
7788
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
deb http://ppa.launchpad.net/webupd8team/java/ubuntu zesty main
2+
# deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu zesty main

0 commit comments

Comments
 (0)