diff options
author | Andrew Nelson <andrew2nelson@arista.com> | 2021-03-10 23:13:26 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-11 08:13:26 +0100 |
commit | 55ba7b2e0f7a1c542c88022d65b16ca79a300e6c (patch) | |
tree | e735eae5a44cafff79b91ef1b95527c87b631824 | |
parent | 4519f59b5fc258653027b89705bb2ac832d25a17 (diff) | |
download | go-git-55ba7b2e0f7a1c542c88022d65b16ca79a300e6c.tar.gz |
diff: Allow srcPrefix and dstPrefix to be configured (#265)
* diff: Allow srcPrefix and dstPrefix to be configured
The default behavior here remains the same, but this change does
allow consumers of the UnifiedEncoder to set their own path prefixes
which will override the defaults of a/ and b/.
* Add unit test for src/dstPrefix in encoder
-rw-r--r-- | plumbing/format/diff/unified_encoder.go | 31 | ||||
-rw-r--r-- | plumbing/format/diff/unified_encoder_test.go | 28 |
2 files changed, 53 insertions, 6 deletions
diff --git a/plumbing/format/diff/unified_encoder.go b/plumbing/format/diff/unified_encoder.go index 413984a..fa605b1 100644 --- a/plumbing/format/diff/unified_encoder.go +++ b/plumbing/format/diff/unified_encoder.go @@ -38,6 +38,10 @@ type UnifiedEncoder struct { // a change. contextLines int + // srcPrefix and dstPrefix are prepended to file paths when encoding a diff. + srcPrefix string + dstPrefix string + // colorConfig is the color configuration. The default is no color. color ColorConfig } @@ -46,6 +50,8 @@ type UnifiedEncoder struct { func NewUnifiedEncoder(w io.Writer, contextLines int) *UnifiedEncoder { return &UnifiedEncoder{ Writer: w, + srcPrefix: "a/", + dstPrefix: "b/", contextLines: contextLines, } } @@ -56,6 +62,18 @@ func (e *UnifiedEncoder) SetColor(colorConfig ColorConfig) *UnifiedEncoder { return e } +// SetSrcPrefix sets e's srcPrefix and returns e. +func (e *UnifiedEncoder) SetSrcPrefix(prefix string) *UnifiedEncoder { + e.srcPrefix = prefix + return e +} + +// SetDstPrefix sets e's dstPrefix and returns e. +func (e *UnifiedEncoder) SetDstPrefix(prefix string) *UnifiedEncoder { + e.dstPrefix = prefix + return e +} + // Encode encodes patch. func (e *UnifiedEncoder) Encode(patch Patch) error { sb := &strings.Builder{} @@ -91,7 +109,8 @@ func (e *UnifiedEncoder) writeFilePatchHeader(sb *strings.Builder, filePatch Fil case from != nil && to != nil: hashEquals := from.Hash() == to.Hash() lines = append(lines, - fmt.Sprintf("diff --git a/%s b/%s", from.Path(), to.Path()), + fmt.Sprintf("diff --git %s%s %s%s", + e.srcPrefix, from.Path(), e.dstPrefix, to.Path()), ) if from.Mode() != to.Mode() { lines = append(lines, @@ -115,22 +134,22 @@ func (e *UnifiedEncoder) writeFilePatchHeader(sb *strings.Builder, filePatch Fil ) } if !hashEquals { - lines = e.appendPathLines(lines, "a/"+from.Path(), "b/"+to.Path(), isBinary) + lines = e.appendPathLines(lines, e.srcPrefix+from.Path(), e.dstPrefix+to.Path(), isBinary) } case from == nil: lines = append(lines, - fmt.Sprintf("diff --git a/%s b/%s", to.Path(), to.Path()), + fmt.Sprintf("diff --git %s %s", e.srcPrefix+to.Path(), e.dstPrefix+to.Path()), fmt.Sprintf("new file mode %o", to.Mode()), fmt.Sprintf("index %s..%s", plumbing.ZeroHash, to.Hash()), ) - lines = e.appendPathLines(lines, "/dev/null", "b/"+to.Path(), isBinary) + lines = e.appendPathLines(lines, "/dev/null", e.dstPrefix+to.Path(), isBinary) case to == nil: lines = append(lines, - fmt.Sprintf("diff --git a/%s b/%s", from.Path(), from.Path()), + fmt.Sprintf("diff --git %s %s", e.srcPrefix+from.Path(), e.dstPrefix+from.Path()), fmt.Sprintf("deleted file mode %o", from.Mode()), fmt.Sprintf("index %s..%s", from.Hash(), plumbing.ZeroHash), ) - lines = e.appendPathLines(lines, "a/"+from.Path(), "/dev/null", isBinary) + lines = e.appendPathLines(lines, e.srcPrefix+from.Path(), "/dev/null", isBinary) } sb.WriteString(e.color[Meta]) diff --git a/plumbing/format/diff/unified_encoder_test.go b/plumbing/format/diff/unified_encoder_test.go index 22dc4f1..3eee333 100644 --- a/plumbing/format/diff/unified_encoder_test.go +++ b/plumbing/format/diff/unified_encoder_test.go @@ -52,6 +52,34 @@ Binary files a/binary and b/binary differ `) } +func (s *UnifiedEncoderTestSuite) TestCustomSrcDstPrefix(c *C) { + buffer := bytes.NewBuffer(nil) + e := NewUnifiedEncoder(buffer, 1).SetSrcPrefix("source/prefix/").SetDstPrefix("dest/prefix/") + p := testPatch{ + message: "", + filePatches: []testFilePatch{{ + from: &testFile{ + mode: filemode.Regular, + path: "binary", + seed: "something", + }, + to: &testFile{ + mode: filemode.Regular, + path: "binary", + seed: "otherthing", + }, + }}, + } + + err := e.Encode(p) + c.Assert(err, IsNil) + + c.Assert(buffer.String(), Equals, `diff --git source/prefix/binary dest/prefix/binary +index a459bc245bdbc45e1bca99e7fe61731da5c48da4..6879395eacf3cc7e5634064ccb617ac7aa62be7d 100644 +Binary files source/prefix/binary and dest/prefix/binary differ +`) +} + func (s *UnifiedEncoderTestSuite) TestEncode(c *C) { for _, f := range fixtures { c.Log("executing: ", f.desc) |