Fast implementation of Git in pure Go

receivepack/service, format/pack/ingest: Progress uniform

runxiyu.tngl.sh cb207dc2 74584d2d

verified
+54 -14
+4 -4
format/pack/ingest/ingest.go
··· 51 51 return Result{}, err 52 52 } 53 53 54 - utils.WriteProgressf(state.opts.Progress, "writing index: start\n") 54 + utils.WriteProgressf(state.opts.Progress, "writing index...\r") 55 55 err = state.packFile.Sync() 56 56 if err != nil { 57 57 return Result{}, &DestinationWriteError{Op: fmt.Sprintf("sync pack: %v", err)} ··· 61 61 if err != nil { 62 62 return Result{}, err 63 63 } 64 - utils.WriteProgressf(state.opts.Progress, "writing index: done\n") 64 + utils.WriteProgressf(state.opts.Progress, "writing index: done.\n") 65 65 66 66 if state.opts.WriteRev { 67 - utils.WriteProgressf(state.opts.Progress, "writing reverse index: start\n") 67 + utils.WriteProgressf(state.opts.Progress, "writing reverse index...\r") 68 68 } 69 69 err = writeRev(state) 70 70 if err != nil { 71 71 return Result{}, err 72 72 } 73 73 if state.opts.WriteRev { 74 - utils.WriteProgressf(state.opts.Progress, "writing reverse index: done\n") 74 + utils.WriteProgressf(state.opts.Progress, "writing reverse index: done.\n") 75 75 } 76 76 77 77 return finalizeArtifacts(state)
+2
format/pack/ingest/scan.go
··· 21 21 state.algo.Size(), 22 22 ) 23 23 24 + utils.WriteProgressf(state.opts.Progress, "validating pack header...\r") 24 25 err = readAndValidatePackHeader(state) 25 26 if err != nil { 26 27 return err 27 28 } 29 + utils.WriteProgressf(state.opts.Progress, "validating pack header: done.\n") 28 30 29 31 state.records = make([]objectRecord, 0, state.objectCountHeader) 30 32 state.ofsDeltas = make([]ofsDeltaRef, 0, state.objectCountHeader)
+17 -1
receivepack/service/apply.go
··· 1 1 package service 2 2 3 3 import ( 4 + "codeberg.org/lindenii/furgit/internal/utils" 4 5 "codeberg.org/lindenii/furgit/objectid" 5 6 "codeberg.org/lindenii/furgit/refstore" 6 7 ) 7 8 8 9 func (service *Service) applyAtomic(result *Result, commands []Command) error { 10 + total := len(commands) 11 + utils.WriteProgressf(service.opts.Progress, "updating refs: 0/%d\r", total) 12 + 9 13 tx, err := service.opts.Refs.BeginTransaction() 10 14 if err != nil { 11 15 return err 12 16 } 13 17 14 - for _, command := range commands { 18 + for i, command := range commands { 15 19 err = queueWriteTransaction(tx, command) 16 20 if err != nil { 17 21 _ = tx.Abort() 18 22 19 23 fillCommandErrors(result, commands, err.Error()) 24 + utils.WriteProgressf(service.opts.Progress, "updating refs: failed at %d/%d\n", i+1, total) 20 25 21 26 return nil 22 27 } 28 + 29 + utils.WriteProgressf(service.opts.Progress, "updating refs: %d/%d\r", i+1, total) 23 30 } 24 31 25 32 err = tx.Commit() 26 33 if err != nil { 27 34 fillCommandErrors(result, commands, err.Error()) 35 + utils.WriteProgressf(service.opts.Progress, "updating refs: failed at commit\n") 28 36 29 37 return nil 30 38 } ··· 33 41 for _, command := range commands { 34 42 result.Commands = append(result.Commands, successCommandResult(command)) 35 43 } 44 + utils.WriteProgressf(service.opts.Progress, "updating refs: done.\n") 36 45 37 46 return nil 38 47 } 39 48 40 49 func (service *Service) applyBatch(result *Result, commands []Command) error { 50 + total := len(commands) 51 + utils.WriteProgressf(service.opts.Progress, "updating refs...\r") 52 + 41 53 batch, err := service.opts.Refs.BeginBatch() 42 54 if err != nil { 43 55 return err ··· 49 61 50 62 batchResults, err := batch.Apply() 51 63 if err != nil && len(batchResults) == 0 { 64 + utils.WriteProgressf(service.opts.Progress, "updating refs: failed at apply\n") 65 + 52 66 return err 53 67 } 54 68 ··· 63 77 } 64 78 65 79 result.Commands = append(result.Commands, item) 80 + utils.WriteProgressf(service.opts.Progress, "updating refs: %d/%d\r", i+1, total) 66 81 } 67 82 68 83 result.Applied = appliedAny 84 + utils.WriteProgressf(service.opts.Progress, "updating refs: done.\n") 69 85 70 86 return nil 71 87 }
+7
receivepack/service/execute.go
··· 3 3 import ( 4 4 "context" 5 5 "os" 6 + 7 + "codeberg.org/lindenii/furgit/internal/utils" 6 8 ) 7 9 8 10 // Execute validates one receive-pack request, optionally ingests its pack into ··· 78 80 if req.PackExpected { 79 81 // Git migrates quarantined objects into permanent storage immediately 80 82 // before starting ref updates. 83 + utils.WriteProgressf(service.opts.Progress, "promoting quarantine...\r") 81 84 err = service.promoteQuarantine(quarantineName, quarantineRoot) 82 85 if err != nil { 86 + utils.WriteProgressf(service.opts.Progress, "promoting quarantine: failed: %v\n", err) 87 + 83 88 result.UnpackError = err.Error() 84 89 fillCommandErrors(result, req.Commands, err.Error()) 85 90 86 91 return result, nil 87 92 } 93 + 94 + utils.WriteProgressf(service.opts.Progress, "promoting quarantine: done.\n") 88 95 } 89 96 90 97 if req.Atomic {
+4 -8
receivepack/service/ingest_quarantine.go
··· 16 16 return "", nil, true 17 17 } 18 18 19 - utils.WriteProgressf(service.opts.Progress, "receiving objects: ingesting pack\n") 20 - 21 19 if req.Pack == nil { 22 20 utils.WriteProgressf(service.opts.Progress, "receiving objects: unpack failed: missing pack stream\n") 23 21 ··· 36 34 return "", nil, false 37 35 } 38 36 37 + utils.WriteProgressf(service.opts.Progress, "creating quarantine...\r") 39 38 quarantineName, quarantineRoot, err := service.createQuarantineRoot() 40 39 if err != nil { 41 40 utils.WriteProgressf(service.opts.Progress, "receiving objects: unpack failed: %v\n", err) ··· 58 57 59 58 return "", nil, false 60 59 } 60 + utils.WriteProgressf(service.opts.Progress, "creating quarantine: done.\n") 61 + utils.WriteProgressf(service.opts.Progress, "receiving objects: unpacking...\r") 61 62 62 63 ingested, err := ingest.Ingest( 63 64 req.Pack, ··· 85 86 return "", nil, false 86 87 } 87 88 88 - utils.WriteProgressf( 89 - service.opts.Progress, 90 - "receiving objects: unpack ok, %d objects (%s)\n", 91 - ingested.ObjectCount, 92 - ingested.PackHash, 93 - ) 89 + utils.WriteProgressf(service.opts.Progress, "receiving objects: unpacking: done (%d objects, %s).\n", ingested.ObjectCount, ingested.PackHash) 94 90 95 91 result.Ingest = &ingested 96 92
+20 -1
receivepack/service/run_hook.go
··· 1 1 package service 2 2 3 - import "context" 3 + import ( 4 + "context" 5 + 6 + "codeberg.org/lindenii/furgit/internal/utils" 7 + ) 4 8 5 9 func (service *Service) runHook( 6 10 ctx context.Context, ··· 26 30 return allowedCommands, allowedIndices, rejected, true, "" 27 31 } 28 32 33 + utils.WriteProgressf(service.opts.Progress, "running hooks...\r") 34 + 29 35 quarantinedObjects, err := service.openQuarantinedObjects(quarantineName) 30 36 if err != nil { 37 + utils.WriteProgressf(service.opts.Progress, "running hooks: failed: %v\n", err) 38 + 31 39 return nil, nil, nil, false, err.Error() 32 40 } 33 41 ··· 44 52 IO: service.opts.HookIO, 45 53 }) 46 54 if err != nil { 55 + utils.WriteProgressf(service.opts.Progress, "running hooks: failed: %v\n", err) 56 + 47 57 return nil, nil, nil, false, err.Error() 48 58 } 49 59 50 60 if len(decisions) != len(commands) { 61 + utils.WriteProgressf(service.opts.Progress, "running hooks: failed: wrong decision count\n") 62 + 51 63 return nil, nil, nil, false, "hook returned wrong number of update decisions" 52 64 } 53 65 ··· 69 81 70 82 rejected[index] = message 71 83 } 84 + 85 + utils.WriteProgressf( 86 + service.opts.Progress, 87 + "running hooks: done (%d/%d accepted).\n", 88 + len(allowedCommands), 89 + len(commands), 90 + ) 72 91 73 92 return allowedCommands, allowedIndices, rejected, true, "" 74 93 }