11using System ;
2+ using System . Linq ;
23using System . Text ;
34
45namespace GitRewrite . GitObjects
56{
67 public sealed class Tag : GitObjectBase
78 {
9+ private static readonly byte [ ] TagKey = "tag" . Select ( x => ( byte ) x ) . ToArray ( ) ;
10+ private readonly Memory < byte > _content ;
11+ private readonly Memory < byte > _message ;
812 private readonly Memory < byte > _object ;
9- private readonly Memory < byte > _type ;
1013 private readonly Memory < byte > _tag ;
1114 private readonly Memory < byte > _tagger ;
12- private readonly Memory < byte > _message ;
13- private readonly Memory < byte > _content ;
15+ private readonly Memory < byte > _type ;
16+
17+ public Tag ( ObjectHash hash , Memory < byte > content ) : base ( hash , GitObjectType . Tag )
18+ {
19+ _content = content ;
20+
21+ var nextNewLine = content . Span . IndexOf < byte > ( 10 ) ;
22+ while ( nextNewLine != - 1 )
23+ {
24+ var contentSpan = content . Span ;
25+ if ( contentSpan . StartsWith ( ObjectPrefixes . ObjectPrefix ) )
26+ {
27+ _object = content . Slice ( 0 , nextNewLine ) ;
28+ }
29+ else if ( contentSpan . StartsWith ( ObjectPrefixes . TypePrefix ) )
30+ {
31+ _type = content . Slice ( 0 , nextNewLine ) ;
32+ }
33+ else if ( contentSpan . StartsWith ( ObjectPrefixes . TagPrefix ) )
34+ {
35+ _tag = content . Slice ( 0 , nextNewLine ) ;
36+ }
37+ else if ( contentSpan . StartsWith ( ObjectPrefixes . TaggerPrefix ) )
38+ {
39+ _tagger = content . Slice ( 0 , nextNewLine ) ;
40+ }
41+ else if ( content . Span [ 0 ] == 10 )
42+ {
43+ _message = content . Slice ( 1 ) ;
44+ break ;
45+ }
46+
47+ content = content . Slice ( nextNewLine + 1 ) ;
48+ nextNewLine = content . Span . IndexOf < byte > ( 10 ) ;
49+ }
50+ }
51+
52+ public string Object => Encoding . UTF8 . GetString ( _object . Span . Slice ( 7 ) ) ;
53+ public string TypeName => Encoding . UTF8 . GetString ( _type . Span . Slice ( 5 ) ) ;
54+ public string TagName => Encoding . UTF8 . GetString ( _tag . Span . Slice ( 4 ) ) ;
55+ public string Tagger => Encoding . UTF8 . GetString ( _tagger . Span . Slice ( 7 ) ) ;
56+ public string Message => Encoding . UTF8 . GetString ( _message . Span ) ;
57+
58+ public bool PointsToTag => _type . Span . StartsWith ( TagKey ) ;
1459
1560 public Tag WithNewObject ( string obj )
1661 {
1762 var resultBuffer = new byte [ _content . Length ] ;
1863 var resultIndex = 0 ;
1964
20- for ( int i = 0 ; i < 7 ; i ++ )
65+ for ( var i = 0 ; i < 7 ; i ++ )
2166 resultBuffer [ resultIndex ++ ] = _object . Span [ i ] ;
2267
2368 var objBytes = Encoding . ASCII . GetBytes ( obj ) ;
24- for ( int i = 0 ; i < objBytes . Length ; i ++ )
69+ for ( var i = 0 ; i < objBytes . Length ; i ++ )
2570 resultBuffer [ resultIndex ++ ] = objBytes [ i ] ;
2671
2772 resultBuffer [ resultIndex ++ ] = 10 ;
2873
29- for ( int i = 0 ; i < _type . Length ; i ++ )
74+ for ( var i = 0 ; i < _type . Length ; i ++ )
3075 resultBuffer [ resultIndex ++ ] = _type . Span [ i ] ;
3176
3277 resultBuffer [ resultIndex ++ ] = 10 ;
3378
34- for ( int i = 0 ; i < _tag . Length ; i ++ )
79+ for ( var i = 0 ; i < _tag . Length ; i ++ )
3580 resultBuffer [ resultIndex ++ ] = _tag . Span [ i ] ;
3681
3782 resultBuffer [ resultIndex ++ ] = 10 ;
3883
39- for ( int i = 0 ; i < _tagger . Length ; i ++ )
84+ for ( var i = 0 ; i < _tagger . Length ; i ++ )
4085 resultBuffer [ resultIndex ++ ] = _tagger . Span [ i ] ;
4186
4287 resultBuffer [ resultIndex ++ ] = 10 ;
4388 resultBuffer [ resultIndex ++ ] = 10 ;
4489
45- for ( int i = 0 ; i < _message . Length ; i ++ )
90+ for ( var i = 0 ; i < _message . Length ; i ++ )
4691 resultBuffer [ resultIndex ++ ] = _message . Span [ i ] ;
4792
4893 return GitObjectFactory . TagFromContentBytes ( resultBuffer ) ;
4994 }
5095
51- public string Object => Encoding . UTF8 . GetString ( _object . Span . Slice ( 7 ) ) ;
52- public string TypeName => Encoding . UTF8 . GetString ( _type . Span . Slice ( 5 ) ) ;
53- public string TagName => Encoding . UTF8 . GetString ( _tag . Span . Slice ( 4 ) ) ;
54- public string Tagger => Encoding . UTF8 . GetString ( _tagger . Span . Slice ( 7 ) ) ;
55- public string Message => Encoding . UTF8 . GetString ( _message . Span ) ;
56-
57- public bool PointsToTag => StartsWith ( _type . Slice ( 5 ) , "tag" ) ;
58-
59- public Tag ( ObjectHash hash , Memory < byte > content ) : base ( hash , GitObjectType . Tag )
60- {
61- _content = content ;
62-
63- var nextNewLine = content . Span . IndexOf < byte > ( 10 ) ;
64- while ( nextNewLine != - 1 )
65- {
66- if ( StartsWith ( content , "object " ) )
67- _object = content . Slice ( 0 , nextNewLine ) ;
68- else if ( StartsWith ( content , "type " ) )
69- _type = content . Slice ( 0 , nextNewLine ) ;
70- else if ( StartsWith ( content , "tag " ) )
71- _tag = content . Slice ( 0 , nextNewLine ) ;
72- else if ( StartsWith ( content , "tagger " ) )
73- _tagger = content . Slice ( 0 , nextNewLine ) ;
74- else if ( content . Span [ 0 ] == 10 )
75- {
76- _message = content . Slice ( 1 ) ;
77- break ;
78- }
79-
80- content = content . Slice ( nextNewLine + 1 ) ;
81- nextNewLine = content . Span . IndexOf < byte > ( 10 ) ;
82- }
83- }
84-
8596 public override byte [ ] SerializeToBytes ( ) => _content . ToArray ( ) ;
8697 }
8798}
0 commit comments