[archiver] Sort database entries

This commit is contained in:
Ciprian Dorin Craciun 2018-11-15 21:32:24 +02:00
parent 2df17ee939
commit 4f567027af

View file

@ -271,7 +271,7 @@ func archiveDataReference (_context *context, _namespace string, _pathInArchive
func walkPath (_context *context, _path string, _prefix string, _name string, _recursed map[string]uint) (os.FileInfo, error) { func walkPath (_context *context, _path string, _prefix string, _name string, _recursed map[string]uint, _recurse bool) (os.FileInfo, error) {
if _recursed == nil { if _recursed == nil {
_recursed = make (map[string]uint, 128) _recursed = make (map[string]uint, 128)
@ -285,6 +285,7 @@ func walkPath (_context *context, _path string, _prefix string, _name string, _r
} else { } else {
return nil, _error return nil, _error
} }
_statMode := _stat.Mode ()
_isSymlink := false _isSymlink := false
if (_stat.Mode () & os.ModeSymlink) != 0 { if (_stat.Mode () & os.ModeSymlink) != 0 {
@ -295,6 +296,11 @@ func walkPath (_context *context, _path string, _prefix string, _name string, _r
return nil, _error return nil, _error
} }
} }
_statMode = _stat.Mode ()
if ! _recurse {
return _stat, nil
}
var _pathResolved string var _pathResolved string
if _isSymlink { if _isSymlink {
@ -311,14 +317,18 @@ func walkPath (_context *context, _path string, _prefix string, _name string, _r
log.Printf ("[ ] ~~ %s -> %s\n", _pathInArchive, _pathResolved) log.Printf ("[ ] ~~ %s -> %s\n", _pathInArchive, _pathResolved)
} }
if _stat.Mode () .IsRegular () {
if _statMode.IsRegular () {
if _context.debug { if _context.debug {
log.Printf ("[ ] ## %s\n", _pathInArchive) log.Printf ("[ ] ## %s\n", _pathInArchive)
} }
return _stat, archiveFile (_context, _pathResolved, _pathInArchive, _name) if _error := archiveFile (_context, _pathResolved, _pathInArchive, _name); _error != nil {
return _stat, _error
}
return _stat, nil
} else if _stat.Mode () .IsDir () { } else if _statMode.IsDir () {
_wasRecursed, _ := _recursed[_pathResolved] _wasRecursed, _ := _recursed[_pathResolved]
if _wasRecursed > 0 { if _wasRecursed > 0 {
@ -327,13 +337,12 @@ func walkPath (_context *context, _path string, _prefix string, _name string, _r
} }
_recursed[_pathResolved] = _wasRecursed + 1 _recursed[_pathResolved] = _wasRecursed + 1
if _context.debug {
log.Printf ("[ ] >> %s\n", _pathInArchive)
}
_names := make ([]string, 0, 16) _names := make ([]string, 0, 16)
_stats := make (map[string]os.FileInfo, 16) _stats := make (map[string]os.FileInfo, 16)
if _context.debug {
log.Printf ("[ ] *> %s\n", _pathInArchive)
}
if _stream, _error := os.Open (_path); _error == nil { if _stream, _error := os.Open (_path); _error == nil {
defer _stream.Close () defer _stream.Close ()
_prefix = filepath.Join (_prefix, _name) _prefix = filepath.Join (_prefix, _name)
@ -343,7 +352,7 @@ func walkPath (_context *context, _path string, _prefix string, _name string, _r
for _, _stat := range _buffer { for _, _stat := range _buffer {
_name := _stat.Name () _name := _stat.Name ()
_names = append (_names, _name) _names = append (_names, _name)
if _stat, _error := walkPath (_context, filepath.Join (_path, _name), _prefix, _name, _recursed); _error == nil { if _stat, _error := walkPath (_context, filepath.Join (_path, _name), _prefix, _name, _recursed, false); _error == nil {
_stats[_name] = _stat _stats[_name] = _stat
} else { } else {
return nil, _error return nil, _error
@ -356,13 +365,12 @@ func walkPath (_context *context, _path string, _prefix string, _name string, _r
} }
} }
} }
if _context.debug {
log.Printf ("[ ] *< %s\n", _pathInArchive)
}
sort.Strings (_names) sort.Strings (_names)
if _context.debug {
log.Printf ("[ ] << %s\n", _pathInArchive)
}
if _context.debug { if _context.debug {
log.Printf ("[ ] <> %s\n", _pathInArchive) log.Printf ("[ ] <> %s\n", _pathInArchive)
} }
@ -370,11 +378,46 @@ func walkPath (_context *context, _path string, _prefix string, _name string, _r
return nil, _error return nil, _error
} }
if _context.debug {
log.Printf ("[ ] >> %s\n", _pathInArchive)
}
for _, _name := range _names {
_stat := _stats[_name]
_statMode := _stat.Mode ()
if _statMode.IsRegular () {
if _, _error := walkPath (_context, filepath.Join (_path, _name), _prefix, _name, _recursed, true); _error != nil {
return _stat, _error
}
}
}
for _, _name := range _names {
_stat := _stats[_name]
_statMode := _stat.Mode ()
if _statMode.IsDir () {
if _, _error := walkPath (_context, filepath.Join (_path, _name), _prefix, _name, _recursed, true); _error != nil {
return _stat, _error
}
}
}
for _, _name := range _names {
_stat := _stats[_name]
_statMode := _stat.Mode ()
if ! _statMode.IsRegular () && ! _statMode.IsDir () {
if _, _error := walkPath (_context, filepath.Join (_path, _name), _prefix, _name, _recursed, true); _error != nil {
return _stat, _error
}
}
}
if _context.debug {
log.Printf ("[ ] << %s\n", _pathInArchive)
}
_recursed[_pathResolved] = _wasRecursed _recursed[_pathResolved] = _wasRecursed
return _stat, nil return _stat, nil
} else { } else {
return nil, fmt.Errorf ("[d9b836d7] unexpected file type for `%s`: `%s`!", _path, _stat.Mode ()) return nil, fmt.Errorf ("[d9b836d7] unexpected file type for `%s`: `%s`!", _path, _statMode)
} }
} }
@ -454,7 +497,7 @@ cdb-http-archiver
debug : _debug, debug : _debug,
} }
if _, _error := walkPath (_context, _sourcesFolder, "/", "", nil); _error != nil { if _, _error := walkPath (_context, _sourcesFolder, "/", "", nil, true); _error != nil {
AbortError (_error, "[b6a19ef4] failed walking folder!") AbortError (_error, "[b6a19ef4] failed walking folder!")
} }