aboutsummaryrefslogtreecommitdiff
path: root/src/Package/Fetch/git.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/Package/Fetch/git.zig')
-rw-r--r--src/Package/Fetch/git.zig90
1 files changed, 46 insertions, 44 deletions
diff --git a/src/Package/Fetch/git.zig b/src/Package/Fetch/git.zig
index a2ea870c3f..18e15f457f 100644
--- a/src/Package/Fetch/git.zig
+++ b/src/Package/Fetch/git.zig
@@ -198,8 +198,8 @@ pub const Repository = struct {
repo: *Repository,
allocator: Allocator,
format: Oid.Format,
- pack_file: *std.fs.File.Reader,
- index_file: *std.fs.File.Reader,
+ pack_file: *Io.File.Reader,
+ index_file: *Io.File.Reader,
) !void {
repo.* = .{ .odb = undefined };
try repo.odb.init(allocator, format, pack_file, index_file);
@@ -213,7 +213,8 @@ pub const Repository = struct {
/// Checks out the repository at `commit_oid` to `worktree`.
pub fn checkout(
repository: *Repository,
- worktree: std.fs.Dir,
+ io: Io,
+ worktree: Io.Dir,
commit_oid: Oid,
diagnostics: *Diagnostics,
) !void {
@@ -223,13 +224,14 @@ pub const Repository = struct {
if (commit_object.type != .commit) return error.NotACommit;
break :tree_oid try getCommitTree(repository.odb.format, commit_object.data);
};
- try repository.checkoutTree(worktree, tree_oid, "", diagnostics);
+ try repository.checkoutTree(io, worktree, tree_oid, "", diagnostics);
}
/// Checks out the tree at `tree_oid` to `worktree`.
fn checkoutTree(
repository: *Repository,
- dir: std.fs.Dir,
+ io: Io,
+ dir: Io.Dir,
tree_oid: Oid,
current_path: []const u8,
diagnostics: *Diagnostics,
@@ -251,18 +253,18 @@ pub const Repository = struct {
while (try tree_iter.next()) |entry| {
switch (entry.type) {
.directory => {
- try dir.makeDir(entry.name);
- var subdir = try dir.openDir(entry.name, .{});
- defer subdir.close();
+ try dir.createDir(io, entry.name, .default_dir);
+ var subdir = try dir.openDir(io, entry.name, .{});
+ defer subdir.close(io);
const sub_path = try std.fs.path.join(repository.odb.allocator, &.{ current_path, entry.name });
defer repository.odb.allocator.free(sub_path);
- try repository.checkoutTree(subdir, entry.oid, sub_path, diagnostics);
+ try repository.checkoutTree(io, subdir, entry.oid, sub_path, diagnostics);
},
.file => {
try repository.odb.seekOid(entry.oid);
const file_object = try repository.odb.readObject();
if (file_object.type != .blob) return error.InvalidFile;
- var file = dir.createFile(entry.name, .{ .exclusive = true }) catch |e| {
+ var file = dir.createFile(io, entry.name, .{ .exclusive = true }) catch |e| {
const file_name = try std.fs.path.join(diagnostics.allocator, &.{ current_path, entry.name });
errdefer diagnostics.allocator.free(file_name);
try diagnostics.errors.append(diagnostics.allocator, .{ .unable_to_create_file = .{
@@ -271,15 +273,15 @@ pub const Repository = struct {
} });
continue;
};
- defer file.close();
- try file.writeAll(file_object.data);
+ defer file.close(io);
+ try file.writePositionalAll(io, file_object.data, 0);
},
.symlink => {
try repository.odb.seekOid(entry.oid);
const symlink_object = try repository.odb.readObject();
if (symlink_object.type != .blob) return error.InvalidFile;
const link_name = symlink_object.data;
- dir.symLink(link_name, entry.name, .{}) catch |e| {
+ dir.symLink(io, link_name, entry.name, .{}) catch |e| {
const file_name = try std.fs.path.join(diagnostics.allocator, &.{ current_path, entry.name });
errdefer diagnostics.allocator.free(file_name);
const link_name_dup = try diagnostics.allocator.dupe(u8, link_name);
@@ -294,7 +296,7 @@ pub const Repository = struct {
.gitlink => {
// Consistent with git archive behavior, create the directory but
// do nothing else
- try dir.makeDir(entry.name);
+ try dir.createDir(io, entry.name, .default_dir);
},
}
}
@@ -370,9 +372,9 @@ pub const Repository = struct {
/// [pack-format](https://git-scm.com/docs/pack-format).
const Odb = struct {
format: Oid.Format,
- pack_file: *std.fs.File.Reader,
+ pack_file: *Io.File.Reader,
index_header: IndexHeader,
- index_file: *std.fs.File.Reader,
+ index_file: *Io.File.Reader,
cache: ObjectCache = .{},
allocator: Allocator,
@@ -381,8 +383,8 @@ const Odb = struct {
odb: *Odb,
allocator: Allocator,
format: Oid.Format,
- pack_file: *std.fs.File.Reader,
- index_file: *std.fs.File.Reader,
+ pack_file: *Io.File.Reader,
+ index_file: *Io.File.Reader,
) !void {
try pack_file.seekTo(0);
try index_file.seekTo(0);
@@ -1270,8 +1272,8 @@ const IndexEntry = struct {
pub fn indexPack(
allocator: Allocator,
format: Oid.Format,
- pack: *std.fs.File.Reader,
- index_writer: *std.fs.File.Writer,
+ pack: *Io.File.Reader,
+ index_writer: *Io.File.Writer,
) !void {
try pack.seekTo(0);
@@ -1370,7 +1372,7 @@ pub fn indexPack(
fn indexPackFirstPass(
allocator: Allocator,
format: Oid.Format,
- pack: *std.fs.File.Reader,
+ pack: *Io.File.Reader,
index_entries: *std.AutoHashMapUnmanaged(Oid, IndexEntry),
pending_deltas: *std.ArrayList(IndexEntry),
) !Oid {
@@ -1423,7 +1425,7 @@ fn indexPackFirstPass(
fn indexPackHashDelta(
allocator: Allocator,
format: Oid.Format,
- pack: *std.fs.File.Reader,
+ pack: *Io.File.Reader,
delta: IndexEntry,
index_entries: std.AutoHashMapUnmanaged(Oid, IndexEntry),
cache: *ObjectCache,
@@ -1475,7 +1477,7 @@ fn indexPackHashDelta(
fn resolveDeltaChain(
allocator: Allocator,
format: Oid.Format,
- pack: *std.fs.File.Reader,
+ pack: *Io.File.Reader,
base_object: Object,
delta_offsets: []const u64,
cache: *ObjectCache,
@@ -1582,17 +1584,17 @@ fn runRepositoryTest(io: Io, comptime format: Oid.Format, head_commit: []const u
var git_dir = testing.tmpDir(.{});
defer git_dir.cleanup();
- var pack_file = try git_dir.dir.createFile("testrepo.pack", .{ .read = true });
- defer pack_file.close();
- try pack_file.writeAll(testrepo_pack);
+ var pack_file = try git_dir.dir.createFile(io, "testrepo.pack", .{ .read = true });
+ defer pack_file.close(io);
+ try pack_file.writeStreamingAll(io, testrepo_pack);
var pack_file_buffer: [2000]u8 = undefined;
var pack_file_reader = pack_file.reader(io, &pack_file_buffer);
- var index_file = try git_dir.dir.createFile("testrepo.idx", .{ .read = true });
- defer index_file.close();
+ var index_file = try git_dir.dir.createFile(io, "testrepo.idx", .{ .read = true });
+ defer index_file.close(io);
var index_file_buffer: [2000]u8 = undefined;
- var index_file_writer = index_file.writer(&index_file_buffer);
+ var index_file_writer = index_file.writer(io, &index_file_buffer);
try indexPack(testing.allocator, format, &pack_file_reader, &index_file_writer);
// Arbitrary size limit on files read while checking the repository contents
@@ -1600,7 +1602,7 @@ fn runRepositoryTest(io: Io, comptime format: Oid.Format, head_commit: []const u
const max_file_size = 8192;
if (!skip_checksums) {
- const index_file_data = try git_dir.dir.readFileAlloc("testrepo.idx", testing.allocator, .limited(max_file_size));
+ const index_file_data = try git_dir.dir.readFileAlloc(io, "testrepo.idx", testing.allocator, .limited(max_file_size));
defer testing.allocator.free(index_file_data);
// testrepo.idx is generated by Git. The index created by this file should
// match it exactly. Running `git verify-pack -v testrepo.pack` can verify
@@ -1621,7 +1623,7 @@ fn runRepositoryTest(io: Io, comptime format: Oid.Format, head_commit: []const u
var diagnostics: Diagnostics = .{ .allocator = testing.allocator };
defer diagnostics.deinit();
- try repository.checkout(worktree.dir, commit_id, &diagnostics);
+ try repository.checkout(io, worktree.dir, commit_id, &diagnostics);
try testing.expect(diagnostics.errors.items.len == 0);
const expected_files: []const []const u8 = &.{
@@ -1646,7 +1648,7 @@ fn runRepositoryTest(io: Io, comptime format: Oid.Format, head_commit: []const u
defer for (actual_files.items) |file| testing.allocator.free(file);
var walker = try worktree.dir.walk(testing.allocator);
defer walker.deinit();
- while (try walker.next()) |entry| {
+ while (try walker.next(io)) |entry| {
if (entry.kind != .file) continue;
const path = try testing.allocator.dupe(u8, entry.path);
errdefer testing.allocator.free(path);
@@ -1676,7 +1678,7 @@ fn runRepositoryTest(io: Io, comptime format: Oid.Format, head_commit: []const u
\\revision 19
\\
;
- const actual_file_contents = try worktree.dir.readFileAlloc("file", testing.allocator, .limited(max_file_size));
+ const actual_file_contents = try worktree.dir.readFileAlloc(io, "file", testing.allocator, .limited(max_file_size));
defer testing.allocator.free(actual_file_contents);
try testing.expectEqualStrings(expected_file_contents, actual_file_contents);
}
@@ -1700,7 +1702,7 @@ test "SHA-256 packfile indexing and checkout" {
pub fn main() !void {
const allocator = std.heap.smp_allocator;
- var threaded: Io.Threaded = .init(allocator);
+ var threaded: Io.Threaded = .init(allocator, .{});
defer threaded.deinit();
const io = threaded.io();
@@ -1712,23 +1714,23 @@ pub fn main() !void {
const format = std.meta.stringToEnum(Oid.Format, args[1]) orelse return error.InvalidFormat;
- var pack_file = try std.fs.cwd().openFile(args[2], .{});
- defer pack_file.close();
+ var pack_file = try Io.Dir.cwd().openFile(io, args[2], .{});
+ defer pack_file.close(io);
var pack_file_buffer: [4096]u8 = undefined;
var pack_file_reader = pack_file.reader(io, &pack_file_buffer);
const commit = try Oid.parse(format, args[3]);
- var worktree = try std.fs.cwd().makeOpenPath(args[4], .{});
- defer worktree.close();
+ var worktree = try Io.Dir.cwd().createDirPathOpen(io, args[4], .{});
+ defer worktree.close(io);
- var git_dir = try worktree.makeOpenPath(".git", .{});
- defer git_dir.close();
+ var git_dir = try worktree.createDirPathOpen(io, ".git", .{});
+ defer git_dir.close(io);
std.debug.print("Starting index...\n", .{});
- var index_file = try git_dir.createFile("idx", .{ .read = true });
- defer index_file.close();
+ var index_file = try git_dir.createFile(io, "idx", .{ .read = true });
+ defer index_file.close(io);
var index_file_buffer: [4096]u8 = undefined;
- var index_file_writer = index_file.writer(&index_file_buffer);
+ var index_file_writer = index_file.writer(io, &index_file_buffer);
try indexPack(allocator, format, &pack_file_reader, &index_file_writer);
std.debug.print("Starting checkout...\n", .{});
@@ -1738,7 +1740,7 @@ pub fn main() !void {
defer repository.deinit();
var diagnostics: Diagnostics = .{ .allocator = allocator };
defer diagnostics.deinit();
- try repository.checkout(worktree, commit, &diagnostics);
+ try repository.checkout(io, worktree, commit, &diagnostics);
for (diagnostics.errors.items) |err| {
std.debug.print("Diagnostic: {}\n", .{err});