Skip to content

Commit e815d78

Browse files
committed
Use stdlibc package for stating the file
This way we get all the parameters such as inode and all. The Dart standard library sucks and doesn't provide us the most basic functionality.
1 parent 1aaeab5 commit e815d78

File tree

4 files changed

+29
-99
lines changed

4 files changed

+29
-99
lines changed

lib/checkout.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:file/file.dart';
22
import 'package:path/path.dart' as p;
3+
import 'package:stdlibc/stdlibc.dart' as stdlibc;
34

45
import 'package:dart_git/dart_git.dart';
56
import 'package:dart_git/diff_commit.dart';
@@ -131,7 +132,7 @@ extension Checkout on GitRepository {
131132
fs.file(filePath).writeAsBytesSync(blobObj.blobData);
132133
fs.file(filePath).chmodSync(change.to!.mode.val);
133134

134-
var stat = fs.file(filePath).statSync();
135+
var stat = stdlibc.stat(filePath)!;
135136
index.updatePath(to.path, to.hash, stat);
136137
} else if (change.delete) {
137138
var from = change.from!;

lib/index.dart

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:file/file.dart';
22
import 'package:path/path.dart' as p;
3+
import 'package:stdlibc/stdlibc.dart' as stdlibc;
34

45
import 'package:dart_git/dart_git.dart';
56
import 'package:dart_git/exceptions.dart';
@@ -44,12 +45,14 @@ extension Index on GitRepository {
4445
// LB: Wait is this a linear search over all files??
4546
// Maybe... but omitting it fully does not speed things up.
4647
var ei = index.entries.indexWhere((e) => e.path == pathSpec);
47-
var stat = FileStat.statSync(filePath);
48+
var stat = stdlibc.stat(filePath)!;
4849
if (ei != -1) {
4950
var entry = index.entries[ei];
50-
if (entry.cTime.isAtSameMomentAs(stat.changed) &&
51-
entry.mTime.isAtSameMomentAs(stat.modified) &&
52-
entry.fileSize == stat.size) {
51+
if (entry.cTime.isAtSameMomentAs(stat.st_ctim) &&
52+
entry.mTime.isAtSameMomentAs(stat.st_mtim) &&
53+
entry.ino == stat.st_ino &&
54+
entry.dev == stat.st_dev &&
55+
entry.fileSize == stat.st_size) {
5356
// We assume it is the same file.
5457
return entry;
5558
}
@@ -61,14 +64,11 @@ extension Index on GitRepository {
6164

6265
// Existing file
6366
if (ei != -1) {
64-
assert(data.length == stat.size);
65-
66-
var newEntry = index.entries[ei].copyWith(
67-
hash: hash,
68-
fileSize: data.length,
69-
cTime: stat.changed,
70-
mTime: stat.modified,
71-
);
67+
assert(data.length == stat.st_size);
68+
69+
var hash = index.entries[ei].hash;
70+
var path = index.entries[ei].path;
71+
var newEntry = GitIndexEntry.fromFS(path, stat, hash);
7272
index.entries[ei] = newEntry;
7373
return newEntry;
7474
}

lib/plumbing/index.dart

Lines changed: 14 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'package:buffer/buffer.dart';
66
import 'package:charcode/charcode.dart';
77
import 'package:collection/collection.dart';
88
import 'package:equatable/equatable.dart';
9+
import 'package:stdlibc/stdlibc.dart' as stdlibc;
910

1011
import 'package:dart_git/exceptions.dart';
1112
import 'package:dart_git/plumbing/git_hash.dart';
@@ -207,7 +208,7 @@ class GitIndex {
207208

208209
static final _listEq = const ListEquality().equals;
209210

210-
void updatePath(String path, GitHash hash, FileStat stat) {
211+
void updatePath(String path, GitHash hash, stdlibc.Stat stat) {
211212
var ei = entries.indexWhere((e) => e.path == path);
212213
if (ei == -1) {
213214
var entry = GitIndexEntry.fromFS(path, stat, hash);
@@ -216,13 +217,7 @@ class GitIndex {
216217
}
217218

218219
// Existing file
219-
var entry = entries[ei];
220-
entries[ei] = entry.copyWith(
221-
fileSize: stat.size,
222-
hash: hash,
223-
cTime: stat.changed,
224-
mTime: stat.modified,
225-
);
220+
entries[ei] = GitIndexEntry.fromFS(path, stat, hash);
226221
}
227222

228223
GitHash? removePath(String pathSpec) {
@@ -279,87 +274,20 @@ class GitIndexEntry {
279274
this.intentToAdd = false,
280275
});
281276

282-
GitIndexEntry copyWith({
283-
DateTime? cTime,
284-
DateTime? mTime,
285-
int? dev,
286-
int? ino,
287-
GitFileMode? mode,
288-
int? uid,
289-
int? gid,
290-
int? fileSize,
291-
GitHash? hash,
292-
GitFileStage? stage,
293-
String? path,
294-
bool? skipWorkTree,
295-
bool? intentToAdd,
296-
}) {
297-
return GitIndexEntry(
298-
cTime: cTime ?? this.cTime,
299-
mTime: mTime ?? this.mTime,
300-
dev: dev ?? this.dev,
301-
ino: ino ?? this.ino,
302-
mode: mode ?? this.mode,
303-
uid: uid ?? this.uid,
304-
gid: gid ?? this.gid,
305-
fileSize: fileSize ?? this.fileSize,
306-
hash: hash ?? this.hash,
307-
stage: stage ?? this.stage,
308-
path: path ?? this.path,
309-
skipWorkTree: skipWorkTree ?? this.skipWorkTree,
310-
intentToAdd: intentToAdd ?? this.intentToAdd,
311-
);
312-
}
313-
314-
static GitIndexEntry fromFS(String path, FileStat stat, GitHash hash) {
315-
var cTime = stat.changed;
316-
var mTime = stat.modified;
317-
318-
if (stat.mode == 0) {
319-
throw Exception('Invalid FileMode: ${stat.mode}');
320-
}
321-
var mode = GitFileMode(stat.mode);
322-
323-
// These don't seem to be exposed in Dart
324-
var ino = 0;
325-
var dev = 0;
326-
327-
switch (stat.type) {
328-
case FileSystemEntityType.file:
329-
mode = stat.mode == GitFileMode.Executable.val
330-
? GitFileMode.Executable
331-
: GitFileMode.Regular;
332-
case FileSystemEntityType.directory:
333-
mode = GitFileMode.Dir;
334-
case FileSystemEntityType.link:
335-
mode = GitFileMode.Symlink;
336-
case FileSystemEntityType.notFound:
337-
throw Exception('Invalid FileType: ${stat.type}');
338-
case FileSystemEntityType.pipe:
339-
throw Exception('Invalid FileType: ${stat.type}');
340-
case FileSystemEntityType.unixDomainSock:
341-
throw Exception('Invalid FileType: ${stat.type}');
342-
}
343-
344-
// FIXME: uid, gid don't seem accessible in Dart -https://github.com/dart-lang/sdk/issues/15078
345-
var uid = 0;
346-
var gid = 0;
347-
348-
var fileSize = stat.size;
349-
var stage = GitFileStage(0);
350-
277+
static GitIndexEntry fromFS(String path, stdlibc.Stat stat, GitHash hash) {
351278
assert(!path.startsWith('/'));
279+
352280
return GitIndexEntry(
353-
cTime: cTime,
354-
mTime: mTime,
355-
dev: dev,
356-
ino: ino,
357-
mode: mode,
358-
uid: uid,
359-
gid: gid,
360-
fileSize: fileSize,
281+
cTime: stat.st_ctim,
282+
mTime: stat.st_mtim,
283+
dev: stat.st_dev,
284+
ino: stat.st_ino,
285+
mode: GitFileMode(stat.st_mode),
286+
uid: stat.st_uid,
287+
gid: stat.st_gid,
288+
fileSize: stat.st_size,
361289
hash: hash,
362-
stage: stage,
290+
stage: GitFileStage(0),
363291
path: path,
364292
);
365293
}

pubspec.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ dependencies:
1818
file: ^7.0.0
1919
meta: ^1.8.0
2020
path: ^1.8.2
21+
stdlibc: ^0.1.4
2122
synchronized: ^3.0.1
2223
tuple: ^2.0.1
2324

0 commit comments

Comments
 (0)