Beispiel #1
0
        public static DisposeWrapper <BackupContext> Create()
        {
            var tmpFile = new TempFile();
            var ctx     = BackupContext.FromFile(tmpFile.Filename);

            ctx.Database.EnsureCreated();
            return(new DisposeWrapper <BackupContext>(ctx, _ => tmpFile.Dispose()));
        }
Beispiel #2
0
        public static DisposeWrapper <BackupContext> Create(IEnumerable <string> entries)
        {
            var tmpFile = new TempFile();
            var ctx     = BackupContext.FromFile(tmpFile.Filename);

            ctx.Database.EnsureCreated();

            var resErrors = entries.Select(Fs.ReadEntry).ToList();
            var res       = resErrors.Where(x => x.Stat)
                            .Select(x => (x.Path, x.Name, Stat: x.Stat.Value)).ToList();

            var dirs     = res.Where(x => x.Stat.IsDir()).ToList();
            var files    = res.Where(x => x.Stat.IsFile()).ToList();
            var symlinks = res.Where(x => x.Stat.IsSymlink()).ToList();

            var dms = dirs.Select(d =>
            {
                var(path, name, stat) = d;
                var dm = new DirectoryModel
                {
                    Attributes = new AttributesModel(),
                    Name       = name,
                    Path       = path
                };
                dm.Attributes.SetStat(stat);
                ctx.Directories.Add(dm);

                return(dm);
            }).ToList();

            foreach (var(path, name, stat) in files)
            {
                var parent = dms.FirstOrDefault(d => d.Path == Paths.Directory(path));
                if (parent == null)
                {
                    throw new FsException(path, "No parent directory found in context.", Errno.ENOENT);
                }

                var fm = new FileModel
                {
                    Attributes = new AttributesModel(),
                    Directory  = parent,
                    Filename   = name
                };
                fm.Attributes.SetStat(stat);
                ctx.Files.Add(fm);
            }

            foreach (var(path, name, stat) in symlinks)
            {
                var parent = dms.FirstOrDefault(d => d.Path == Paths.Directory(path));
                if (parent == null)
                {
                    throw new FsException(path, "No parent directory found in context.");
                }

                var sm = new SymlinkModel
                {
                    Attributes = new AttributesModel(),
                    Directory  = parent,
                    Filename   = name
                };
                sm.Attributes.SetStat(stat);
                ctx.Symlinks.Add(sm);
            }

            return(new DisposeWrapper <BackupContext>(ctx, _ => tmpFile.Dispose()));
        }