public void CommandLoop() { while (ContinueLoop) { int hashdisplen = BackupHash.Length <= 6 ? BackupHash.Length : 6; string cachewarning = ""; if (!BCore.DestinationAvailable) { cachewarning = "(cache)"; } Console.Write(String.Format("backup {0}{1}:{2}> ", BackupHash.Substring(0, hashdisplen), cachewarning, CurrentNode.Path)); string[] args = LagernConsole.ReadArgs(); try { Parser.Default.ParseArguments <CDOptions, LSOptions, LagernConsole.ExitOptions, LagernConsole.RestoreOptions, CBOptions, LagernConsole.ListNoNameOptions>(args) .WithParsed <CDOptions>(opts => ChangeDirectory(opts)) .WithParsed <LSOptions>(opts => ListDirectory()) .WithParsed <LagernConsole.ExitOptions>(opts => ContinueLoop = false) .WithParsed <LagernConsole.RestoreOptions>(opts => LagernConsole.RestoreFile(opts)) .WithParsed <CBOptions>(opts => ChangeBackup(opts)) .WithParsed <LagernConsole.ListNoNameOptions>(opts => LagernConsole.ListBackups(opts, BackupSet, BCore)); } catch (ChangeBackupException ex) { Console.WriteLine(ex.Message); } } }
private void ChangeBackup(CBOptions opts) { string curpath = CurrentNode.Path; string backuphash; if (opts.Backup == null) { if (opts.Offset == 0) { throw new ChangeBackupException("Must set either or both backup or offset."); } backuphash = BackupHash; } else { backuphash = opts.Backup; } var targetbackuphashandrecord = BCore.DefaultDstDependencies[BackupDst].Backups.GetBackupHashAndRecord(new BackupSetReference(BackupSet, false, false, false), backuphash, opts.Offset); BackupHash = targetbackuphashandrecord.Item1; BackupCore.BackupRecord backuprecord = targetbackuphashandrecord.Item2; BackupTree = BackupCore.MetadataNode.Load(BCore.DefaultDstDependencies[BackupDst].Blobs, backuprecord.MetadataTreeHash); BackupCore.MetadataNode?curnode = BackupTree.GetDirectory(curpath); if (curnode != null) { CurrentNode = curnode; } else { CurrentNode = BackupTree; } Console.WriteLine("Switching to backup {0}: \"{1}\"", BackupHash.Substring(0, 6), backuprecord.BackupMessage); }