@@ -6,6 +6,7 @@ import 'package:buffer/buffer.dart';
6
6
import 'package:charcode/charcode.dart' ;
7
7
import 'package:collection/collection.dart' ;
8
8
import 'package:equatable/equatable.dart' ;
9
+ import 'package:stdlibc/stdlibc.dart' as stdlibc;
9
10
10
11
import 'package:dart_git/exceptions.dart' ;
11
12
import 'package:dart_git/plumbing/git_hash.dart' ;
@@ -207,7 +208,7 @@ class GitIndex {
207
208
208
209
static final _listEq = const ListEquality ().equals;
209
210
210
- void updatePath (String path, GitHash hash, FileStat stat) {
211
+ void updatePath (String path, GitHash hash, stdlibc. Stat stat) {
211
212
var ei = entries.indexWhere ((e) => e.path == path);
212
213
if (ei == - 1 ) {
213
214
var entry = GitIndexEntry .fromFS (path, stat, hash);
@@ -216,13 +217,7 @@ class GitIndex {
216
217
}
217
218
218
219
// 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);
226
221
}
227
222
228
223
GitHash ? removePath (String pathSpec) {
@@ -279,87 +274,20 @@ class GitIndexEntry {
279
274
this .intentToAdd = false ,
280
275
});
281
276
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) {
351
278
assert (! path.startsWith ('/' ));
279
+
352
280
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 ,
361
289
hash: hash,
362
- stage: stage ,
290
+ stage: GitFileStage ( 0 ) ,
363
291
path: path,
364
292
);
365
293
}
0 commit comments