/// <exception cref="System.IO.IOException"></exception> internal override FileObjectDatabase.InsertLooseObjectResult InsertUnpackedObject (FilePath tmp, ObjectId id, bool createDuplicate) { // If the object is already in the repository, remove temporary file. // if (unpackedObjectCache.IsUnpacked(id)) { FileUtils.Delete(tmp); return FileObjectDatabase.InsertLooseObjectResult.EXISTS_LOOSE; } if (!createDuplicate && Has(id)) { FileUtils.Delete(tmp); return FileObjectDatabase.InsertLooseObjectResult.EXISTS_PACKED; } FilePath dst = FileFor(id); if (dst.Exists()) { // We want to be extra careful and avoid replacing an object // that already exists. We can't be sure renameTo() would // fail on all platforms if dst exists, so we check first. // FileUtils.Delete(tmp); return FileObjectDatabase.InsertLooseObjectResult.EXISTS_LOOSE; } if (tmp.RenameTo(dst)) { dst.SetReadOnly(); unpackedObjectCache.Add(id); return FileObjectDatabase.InsertLooseObjectResult.INSERTED; } // Maybe the directory doesn't exist yet as the object // directories are always lazily created. Note that we // try the rename first as the directory likely does exist. // FileUtils.Mkdir(dst.GetParentFile()); if (tmp.RenameTo(dst)) { dst.SetReadOnly(); unpackedObjectCache.Add(id); return FileObjectDatabase.InsertLooseObjectResult.INSERTED; } if (!createDuplicate && Has(id)) { FileUtils.Delete(tmp); return FileObjectDatabase.InsertLooseObjectResult.EXISTS_PACKED; } // The object failed to be renamed into its proper // location and it doesn't exist in the repository // either. We really don't know what went wrong, so // fail. // FileUtils.Delete(tmp); return FileObjectDatabase.InsertLooseObjectResult.FAILURE; }
private static bool Rename(FilePath src, FilePath dst) { if (src.RenameTo(dst)) { return true; } FilePath dir = dst.GetParentFile(); if ((dir.Exists() || !dir.Mkdirs()) && !dir.IsDirectory()) { return false; } return src.RenameTo(dst); }