Fast implementation of Git in pure Go codeberg.org/lindenii/furgit
git go
6
fork

Configure Feed

Select the types of activity you want to include in your feed.

repository: Use dual

Runxi Yu 84342973 3ba67c27

+40 -41
+34 -23
repository/objects.go
··· 1 1 package repository 2 2 3 3 import ( 4 - "errors" 5 4 "fmt" 6 5 "os" 7 6 8 7 objectid "codeberg.org/lindenii/furgit/object/id" 9 8 objectstore "codeberg.org/lindenii/furgit/object/store" 9 + objectdual "codeberg.org/lindenii/furgit/object/store/dual" 10 10 objectloose "codeberg.org/lindenii/furgit/object/store/loose" 11 - objectmix "codeberg.org/lindenii/furgit/object/store/mix" 12 11 objectpacked "codeberg.org/lindenii/furgit/object/store/packed" 13 12 ) 14 13 ··· 26 25 root *os.Root, 27 26 algo objectid.Algorithm, 28 27 ) ( 29 - objects objectstore.Reader, 28 + objects *objectdual.Dual, 30 29 objectsRoot *os.Root, 31 30 objectsPackRoot *os.Root, 32 31 objectsLoose *objectloose.Store, ··· 45 44 return nil, nil, nil, nil, nil, err 46 45 } 47 46 48 - backends := []objectstore.Reader{objectsLoose} 47 + err = objectsRoot.Mkdir("pack", 0o755) 48 + if err != nil && !os.IsExist(err) { 49 + _ = objectsLoose.Close() 50 + _ = objectsRoot.Close() 51 + 52 + return nil, nil, nil, nil, nil, fmt.Errorf("repository: create objects/pack: %w", err) 53 + } 49 54 50 55 objectsPackRoot, err = objectsRoot.OpenRoot("pack") 51 - if err == nil { 52 - objectsPacked, err = objectpacked.New( 53 - objectsPackRoot, 54 - algo, 55 - objectpacked.Options{RefreshPolicy: objectpacked.RefreshPolicyNever}, 56 - ) 57 - if err != nil { 58 - _ = objectsPackRoot.Close() 59 - _ = objectsLoose.Close() 60 - _ = objectsRoot.Close() 56 + if err != nil { 57 + _ = objectsLoose.Close() 58 + _ = objectsRoot.Close() 61 59 62 - return nil, nil, nil, nil, nil, err 63 - } 60 + return nil, nil, nil, nil, nil, fmt.Errorf("repository: open objects/pack: %w", err) 61 + } 64 62 65 - backends = append(backends, objectsPacked) 66 - } else if !errors.Is(err, os.ErrNotExist) { 63 + objectsPacked, err = objectpacked.New( 64 + objectsPackRoot, 65 + algo, 66 + objectpacked.Options{ 67 + RefreshPolicy: objectpacked.RefreshPolicyNever, 68 + WriteRev: true, 69 + }, 70 + ) 71 + if err != nil { 72 + _ = objectsPackRoot.Close() 67 73 _ = objectsLoose.Close() 68 74 _ = objectsRoot.Close() 69 75 70 - return nil, nil, nil, nil, nil, fmt.Errorf("repository: open objects/pack: %w", err) 76 + return nil, nil, nil, nil, nil, err 71 77 } 72 78 73 - objects = objectmix.New(backends...) 79 + objects = objectdual.New(objectsLoose, objectsPacked) 74 80 75 81 return objects, objectsRoot, objectsPackRoot, objectsLoose, objectsPacked, nil 76 82 } ··· 78 84 // Objects returns the configured object store. 79 85 // 80 86 // Use Objects for direct object-ID lookups, object headers, sizes, raw object 81 - // bytes, or streamed object contents. Callers who want typed object values 82 - // should usually prefer [Repository.Fetcher]. 87 + // bytes, streamed object contents, object writes, pack ingestion, and 88 + // coordinated quarantines. Callers who want typed object values should usually 89 + // prefer [Repository.Fetcher]. 83 90 // 84 91 // Labels: Life-Parent. 85 92 // 86 93 //nolint:ireturn 87 - func (repo *Repository) Objects() objectstore.Reader { 94 + func (repo *Repository) Objects() interface { 95 + objectstore.Reader 96 + objectstore.Writer 97 + objectstore.Quarantiner 98 + } { 88 99 return repo.objects 89 100 }
+2 -2
repository/repository.go
··· 15 15 commitgraphread "codeberg.org/lindenii/furgit/format/commitgraph/read" 16 16 "codeberg.org/lindenii/furgit/object/fetch" 17 17 objectid "codeberg.org/lindenii/furgit/object/id" 18 - objectstore "codeberg.org/lindenii/furgit/object/store" 18 + objectdual "codeberg.org/lindenii/furgit/object/store/dual" 19 19 objectloose "codeberg.org/lindenii/furgit/object/store/loose" 20 20 objectpacked "codeberg.org/lindenii/furgit/object/store/packed" 21 21 refstore "codeberg.org/lindenii/furgit/ref/store" ··· 32 32 config *config.Config 33 33 algo objectid.Algorithm 34 34 35 - objects objectstore.Reader 35 + objects *objectdual.Dual 36 36 fetcher *fetch.Fetcher 37 37 objectsRoot *os.Root 38 38 objectsPackRoot *os.Root
-12
repository/write_loose.go
··· 1 - package repository 2 - 3 - import ( 4 - objectloose "codeberg.org/lindenii/furgit/object/store/loose" 5 - ) 6 - 7 - // LooseStoreForWriting returns the repository's loose-object writer. 8 - // 9 - // Labels: Life-Parent, Close-No. 10 - func (repo *Repository) LooseStoreForWriting() *objectloose.Store { 11 - return repo.objectsLoose 12 - }
+4 -4
repository/write_loose_test.go
··· 23 23 24 24 content := []byte("write-loose-bytes-content\n") 25 25 26 - gotID, err := repo.LooseStoreForWriting().WriteBytesContent(objecttype.TypeBlob, content) 26 + gotID, err := repo.Objects().WriteBytesContent(objecttype.TypeBlob, content) 27 27 if err != nil { 28 28 t.Fatalf("WriteLooseBytesContent: %v", err) 29 29 } ··· 62 62 63 63 content := []byte("write-loose-reader-content\n") 64 64 65 - gotID, err := repo.LooseStoreForWriting().WriteReaderContent(objecttype.TypeBlob, int64(len(content)), bytes.NewReader(content)) 65 + gotID, err := repo.Objects().WriteReaderContent(objecttype.TypeBlob, int64(len(content)), bytes.NewReader(content)) 66 66 if err != nil { 67 67 t.Fatalf("WriteLooseReaderContent: %v", err) 68 68 } ··· 92 92 t.Fatalf("ReadStoredBytesFull: %v", err) 93 93 } 94 94 95 - idFromBytes, err := repo.LooseStoreForWriting().WriteBytesFull(raw) 95 + idFromBytes, err := repo.Objects().WriteBytesFull(raw) 96 96 if err != nil { 97 97 t.Fatalf("WriteLooseBytesFull: %v", err) 98 98 } ··· 101 101 t.Fatalf("WriteLooseBytesFull id = %s, want %s", idFromBytes, commitID) 102 102 } 103 103 104 - idFromReader, err := repo.LooseStoreForWriting().WriteReaderFull(bytes.NewReader(raw)) 104 + idFromReader, err := repo.Objects().WriteReaderFull(bytes.NewReader(raw)) 105 105 if err != nil { 106 106 t.Fatalf("WriteLooseReaderFull: %v", err) 107 107 }