Add --json output for git lfs track

We want a machine readable output for git lfs track, so add a --json
flag to add this.
This commit is contained in:
brian m. carlson 2022-05-11 15:08:39 +00:00
parent c9e2a138b3
commit 6f37e98ae8
No known key found for this signature in database
GPG Key ID: 2D0C9BC12F82B3A1
2 changed files with 76 additions and 0 deletions

@ -3,6 +3,7 @@ package commands
import (
"bufio"
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"os"
@ -29,6 +30,7 @@ var (
trackNoModifyAttrsFlag bool
trackNoExcludedFlag bool
trackFilenameFlag bool
trackJSONFlag bool
)
func trackCommand(cmd *cobra.Command, args []string) {
@ -44,6 +46,10 @@ func trackCommand(cmd *cobra.Command, args []string) {
return
}
if trackJSONFlag {
Exit(tr.Tr.Get("--json option can't be combined with arguments"))
}
mp := gitattr.NewMacroProcessor()
// Intentionally do _not_ consider global- and system-level
@ -221,8 +227,36 @@ ArgsLoop:
}
}
type PatternData struct {
Pattern string `json:"pattern"`
Source string `json:"source"`
Lockable bool `json:"lockable"`
Tracked bool `json:"tracked"`
}
func listPatterns() {
knownPatterns := getAllKnownPatterns()
if trackJSONFlag {
patterns := struct {
Patterns []PatternData `json:"patterns"`
}{Patterns: make([]PatternData, 0, len(knownPatterns))}
for _, p := range knownPatterns {
patterns.Patterns = append(patterns.Patterns, PatternData{
Pattern: p.Path,
Source: p.Source.String(),
Tracked: p.Tracked,
Lockable: p.Lockable,
})
}
encoder := json.NewEncoder(os.Stdout)
encoder.SetIndent("", " ")
err := encoder.Encode(patterns)
if err != nil {
ExitWithError(err)
}
return
}
if len(knownPatterns) < 1 {
return
}
@ -337,5 +371,6 @@ func init() {
cmd.Flags().BoolVarP(&trackNoModifyAttrsFlag, "no-modify-attrs", "", false, "skip modifying .gitattributes file")
cmd.Flags().BoolVarP(&trackNoExcludedFlag, "no-excluded", "", false, "skip listing excluded paths")
cmd.Flags().BoolVarP(&trackFilenameFlag, "filename", "", false, "treat this pattern as a literal filename")
cmd.Flags().BoolVarP(&trackJSONFlag, "json", "", false, "print output in JSON")
})
}

@ -711,3 +711,44 @@ begin_test "track: escaped glob pattern with spaces in .gitattributes"
assert_pointer "main" "$filename" "$contents_oid" 15
)
end_test
begin_test "--json output"
(
set -e
reponame="track-json"
git init "$reponame"
cd "$reponame"
git lfs track '*.dat'
git lfs track --lockable '*.bin'
echo 'a.dat !filter' >>.gitattributes
git lfs track --json > actual
cat >expected <<-EOF
{
"patterns": [
{
"pattern": "*.dat",
"source": ".gitattributes",
"lockable": false,
"tracked": true
},
{
"pattern": "*.bin",
"source": ".gitattributes",
"lockable": true,
"tracked": true
},
{
"pattern": "a.dat",
"source": ".gitattributes",
"lockable": false,
"tracked": false
}
]
}
EOF
diff -u actual expected
)
end_test