1
- import 'package:collection/collection.dart' show IterableExtension;
2
1
import 'package:file/file.dart' ;
2
+ import 'package:path/path.dart' as p;
3
3
4
4
import 'package:dart_git/dart_git.dart' ;
5
5
import 'package:dart_git/exceptions.dart' ;
@@ -13,7 +13,8 @@ extension Index on GitRepository {
13
13
14
14
var index = indexStorage.readIndex ();
15
15
16
- var stat = fs.statSync (pathSpec);
16
+ var filePath = p.join (workTree, pathSpec);
17
+ var stat = fs.statSync (filePath);
17
18
if (stat.type == FileSystemEntityType .file) {
18
19
addFileToIndex (index, pathSpec);
19
20
} else if (stat.type == FileSystemEntityType .directory) {
@@ -42,34 +43,38 @@ extension Index on GitRepository {
42
43
}
43
44
// LB: Wait is this a linear search over all files??
44
45
// Maybe... but omitting it fully does not speed things up.
45
- var entry = index.entries.firstWhereOrNull ((e) => e.path == pathSpec);
46
+ var ei = index.entries.indexWhere ((e) => e.path == pathSpec);
46
47
var stat = FileStat .statSync (filePath);
47
- if (entry != null &&
48
- entry.cTime.isAtSameMomentAs (stat.changed) &&
49
- entry.mTime.isAtSameMomentAs (stat.modified) &&
50
- entry.fileSize == stat.size) {
51
- // We assume it is the same file.
52
- return entry;
48
+ if (ei != - 1 ) {
49
+ var entry = index.entries[ei];
50
+ if (entry.cTime.isAtSameMomentAs (stat.changed) &&
51
+ entry.mTime.isAtSameMomentAs (stat.modified) &&
52
+ entry.fileSize == stat.size) {
53
+ // We assume it is the same file.
54
+ return entry;
55
+ }
53
56
}
54
57
55
58
var data = file.readAsBytesSync ();
56
59
var blob = GitBlob (data, null ); // Hash the file (takes time!)
57
60
var hash = objStorage.writeObject (blob);
58
61
59
62
// Existing file
60
- if (entry != null ) {
63
+ if (ei != - 1 ) {
61
64
assert (data.length == stat.size);
62
65
63
- return entry .copyWith (
66
+ var newEntry = index.entries[ei] .copyWith (
64
67
hash: hash,
65
68
fileSize: data.length,
66
69
cTime: stat.changed,
67
70
mTime: stat.modified,
68
71
);
72
+ index.entries[ei] = newEntry;
73
+ return newEntry;
69
74
}
70
75
71
76
// New file
72
- entry = GitIndexEntry .fromFS (pathSpec, stat, hash);
77
+ var entry = GitIndexEntry .fromFS (pathSpec, stat, hash);
73
78
index.entries.add (entry);
74
79
return entry;
75
80
}
0 commit comments