@@ -14,7 +14,7 @@ import (
14
14
15
15
var (
16
16
// EncodeVersionSupported is the range of supported index versions
17
- EncodeVersionSupported uint32 = 2
17
+ EncodeVersionSupported uint32 = 3
18
18
19
19
// ErrInvalidTimestamp is returned by Encode if a Index with a Entry with
20
20
// negative timestamp values
@@ -36,9 +36,9 @@ func NewEncoder(w io.Writer) *Encoder {
36
36
37
37
// Encode writes the Index to the stream of the encoder.
38
38
func (e * Encoder ) Encode (idx * Index ) error {
39
- // TODO: support versions v3 and v4
39
+ // TODO: support v4
40
40
// TODO: support extensions
41
- if idx .Version != EncodeVersionSupported {
41
+ if idx .Version > EncodeVersionSupported {
42
42
return ErrUnsupportedVersion
43
43
}
44
44
@@ -68,8 +68,12 @@ func (e *Encoder) encodeEntries(idx *Index) error {
68
68
if err := e .encodeEntry (entry ); err != nil {
69
69
return err
70
70
}
71
+ entryLength := entryHeaderLength
72
+ if entry .IntentToAdd || entry .SkipWorktree {
73
+ entryLength += 2
74
+ }
71
75
72
- wrote := entryHeaderLength + len (entry .Name )
76
+ wrote := entryLength + len (entry .Name )
73
77
if err := e .padEntry (wrote ); err != nil {
74
78
return err
75
79
}
@@ -79,10 +83,6 @@ func (e *Encoder) encodeEntries(idx *Index) error {
79
83
}
80
84
81
85
func (e * Encoder ) encodeEntry (entry * Entry ) error {
82
- if entry .IntentToAdd || entry .SkipWorktree {
83
- return ErrUnsupportedVersion
84
- }
85
-
86
86
sec , nsec , err := e .timeToUint32 (& entry .CreatedAt )
87
87
if err != nil {
88
88
return err
@@ -110,9 +110,25 @@ func (e *Encoder) encodeEntry(entry *Entry) error {
110
110
entry .GID ,
111
111
entry .Size ,
112
112
entry .Hash [:],
113
- flags ,
114
113
}
115
114
115
+ flagsFlow := []interface {}{flags }
116
+
117
+ if entry .IntentToAdd || entry .SkipWorktree {
118
+ var extendedFlags uint16
119
+
120
+ if entry .IntentToAdd {
121
+ extendedFlags |= intentToAddMask
122
+ }
123
+ if entry .SkipWorktree {
124
+ extendedFlags |= skipWorkTreeMask
125
+ }
126
+
127
+ flagsFlow = []interface {}{flags | entryExtended , extendedFlags }
128
+ }
129
+
130
+ flow = append (flow , flagsFlow ... )
131
+
116
132
if err := binary .Write (e .w , flow ... ); err != nil {
117
133
return err
118
134
}
0 commit comments