@@ -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+ }
0 commit comments