Path: blob/main/components/content-service/pkg/git/porcelain.go
2500 views
// Copyright (c) 2020 Gitpod GmbH. All rights reserved.1// Licensed under the GNU Affero General Public License (AGPL).2// See License.AGPL.txt in the project root for license information.34package git56import (7"bufio"8"io"9"strings"1011"golang.org/x/xerrors"12)1314const (15prefixBranchOID = "# branch.oid "16prefixBranchHead = "# branch.head "17prefixChangedFile = "1 "18prefixRenamedFile = "2 "19prefixUnmargedFile = "u "20prefixUntrackedFile = "? "21)2223// porcelainStatus represents the information gathered from Git porcelain v2 output, see https://git-scm.com/docs/git-status#_porcelain_format_version_224type porcelainStatus struct {25BranchOID string26BranchHead string27UncommitedFiles []string28UntrackedFiles []string29}3031// ParsePorcelain parses the porcelain v2 format32func parsePorcelain(in io.Reader) (*porcelainStatus, error) {33res := porcelainStatus{34UncommitedFiles: make([]string, 0),35UntrackedFiles: make([]string, 0),36}3738scanner := bufio.NewScanner(in)39for scanner.Scan() {40line := scanner.Text()4142if strings.HasPrefix(line, prefixBranchOID) {43res.BranchOID = strings.TrimPrefix(line, prefixBranchOID)44} else if strings.HasPrefix(line, prefixBranchHead) {45res.BranchHead = strings.TrimPrefix(line, prefixBranchHead)46} else if strings.HasPrefix(line, prefixChangedFile) ||47strings.HasPrefix(line, prefixRenamedFile) ||48strings.HasPrefix(line, prefixRenamedFile) ||49strings.HasPrefix(line, prefixUnmargedFile) {5051segments := strings.Split(line, " ")52file := segments[len(segments)-1]53res.UncommitedFiles = append(res.UncommitedFiles, file)54} else if strings.HasPrefix(line, prefixUntrackedFile) {55segments := strings.Split(line, " ")56file := segments[len(segments)-1]57res.UntrackedFiles = append(res.UntrackedFiles, file)58}59}60if err := scanner.Err(); err != nil {61return nil, xerrors.Errorf("cannot parse porcelain: %v", err)62}6364if len(res.UncommitedFiles) == 0 {65res.UncommitedFiles = nil66}67if len(res.UntrackedFiles) == 0 {68res.UntrackedFiles = nil69}7071return &res, nil72}737475