func makeRegularInode(fullPathname string, inode *filesystem.RegularInode, multiplyUsedObjects map[hash.Hash]uint64) { var err error if inode.Size > 0 { objectPathname := path.Join(objectsDir, objectcache.HashToFilename(inode.Hash)) numCopies := multiplyUsedObjects[inode.Hash] if numCopies > 1 { numCopies-- objectPathname += strings.Repeat("~", int(numCopies)) if numCopies < 2 { delete(multiplyUsedObjects, inode.Hash) } } err = os.Rename(objectPathname, fullPathname) } else { _, err = os.Create(fullPathname) } if err != nil { logger.Println(err) return } if err := inode.WriteMetadata(fullPathname); err != nil { logger.Println(err) } else { if inode.Size > 0 { logger.Printf("Made inode: %s from: %x\n", fullPathname, inode.Hash) } else { logger.Printf("Made empty inode: %s\n", fullPathname) } } }
func makeRegularInode(fullPathname string, inode *filesystem.RegularInode, multiplyUsedObjects map[hash.Hash]uint64, objectsDir string, logger *log.Logger) error { var objectPathname string if inode.Size > 0 { objectPathname = path.Join(objectsDir, objectcache.HashToFilename(inode.Hash)) numCopies := multiplyUsedObjects[inode.Hash] if numCopies > 1 { numCopies-- objectPathname += fmt.Sprintf("~%d~", numCopies) if numCopies < 2 { delete(multiplyUsedObjects, inode.Hash) } else { multiplyUsedObjects[inode.Hash] = numCopies } } } else { objectPathname = fmt.Sprintf("%s.empty.%d", fullPathname, os.Getpid()) if file, err := os.OpenFile(objectPathname, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600); err != nil { return err } else { file.Close() } } if err := fsutil.ForceRename(objectPathname, fullPathname); err != nil { logger.Println(err) return err } if err := inode.WriteMetadata(fullPathname); err != nil { logger.Println(err) return err } else { if inode.Size > 0 { logger.Printf("Made inode: %s from: %x\n", fullPathname, inode.Hash) } else { logger.Printf("Made empty inode: %s\n", fullPathname) } } return nil }