public void Write( FilePath filePath, Stream data, DateTimeOffset modificationTime, int mode, string userId, string groupId, char typeflag, string userName, string groupName, string deviceMajorNumber, string deviceMinorNumber, string entrySha, bool isLink) { FileNameExtendedHeader fileNameExtendedHeader = FileNameExtendedHeader.Parse(filePath.Posix, entrySha); LinkExtendedHeader linkExtendedHeader = ParseLink(isLink, data, entrySha); WriteExtendedHeader(fileNameExtendedHeader, linkExtendedHeader, entrySha, modificationTime); // Note: in case of links, we won't add a content, but the size in the header will still be != 0. It seems strange, but it seem to be what git.git is doing? WriteHeader(fileNameExtendedHeader.Name, fileNameExtendedHeader.Prefix, modificationTime, (data != null) ? data.Length : 0, mode, userId, groupId, typeflag, linkExtendedHeader.Link, userName, groupName, deviceMajorNumber, deviceMinorNumber); // folders have no data, and so do links if (data != null && !isLink) { WriteContent(data.Length, data, OutStream); } AlignTo512((data != null) ? data.Length : 0, false); }
private void WriteExtendedHeader(FileNameExtendedHeader fileNameExtendedHeader, LinkExtendedHeader linkExtendedHeader, string entrySha, DateTimeOffset modificationTime) { string extHeader = string.Empty; if (fileNameExtendedHeader.NeedsExtendedHeaderEntry) { extHeader += BuildKeyValueExtHeader("path", fileNameExtendedHeader.InitialPath); } if (linkExtendedHeader.NeedsExtendedHeaderEntry) { extHeader += BuildKeyValueExtHeader("linkpath", linkExtendedHeader.InitialLink); } if (string.IsNullOrEmpty(extHeader)) { return; } using (var stream = new MemoryStream(Encoding.ASCII.GetBytes(extHeader))) { Write(string.Format(CultureInfo.InvariantCulture, "{0}.paxheader", entrySha), stream, modificationTime, "666".OctalToInt32(), "0", "0", 'x', "root", "root", "0", "0", entrySha, false); } }