/// <summary> /// Removes files that match `path` from the index. /// </summary> public static void Rm(string path, RmOptions options) { Files.AssertInRepo(); Config.AssertNotBare(); options = options ?? new RmOptions(); path = Files.Absolute(path); // Get the paths of all files in the index that match `path`. var filesToRm = Index.MatchingFiles(path); // Abort if `-f` was passed. The removal of files with changes is // not supported. if (options.f) { throw new Exception("unsupported"); } // Abort if no files matched `path`. if (filesToRm.Length == 0) { throw new Exception(Files.PathFromRepoRoot(path) + " did not match any files"); } // Abort if `path` is a directory and `-r` was not passed. var dir = new DirectoryInfo(path); if (dir.Exists && !options.r) { throw new Exception("not removing " + path + " recursively without -r"); } // Get a list of all files that are to be removed and have also // been changed on disk. If this list is not empty then abort. var changesToRm = Diff.AddedOrModifiedFiles().Intersect(filesToRm).ToArray(); if (changesToRm.Length > 0) { throw new Exception("these files have changes:\n" + string.Join("\n", changesToRm) + "\n"); } foreach (var file in filesToRm.Select(Files.WorkingCopyPath).Where(File.Exists)) { File.Delete(file); } foreach (var file in filesToRm) { UpdateIndex(file, new UpdateIndexOptions { UpdateType = UpdateType.Rm }); } }