Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 22 additions & 7 deletions action.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,19 +53,34 @@ func generateActions(before, after Slides) (_ []*action, err error) {
beforeCopy := copySlides(before)
afterCopy := copySlides(after)

// Resolve which before slide each frozen after slide corresponds to, and
// substitute the counterpart's current content into after. The
// similarity-based pipeline below then sees the pair as identical and
// generates no update/delete actions for it, regardless of slide count
// changes (https://github.com/k1LoW/deck/issues/479).
frozenPairs := resolveFrozenSlides(beforeCopy, afterCopy)
for i, afterSlide := range afterCopy {
if !afterSlide.Freeze {
continue
}
if beforeIdx, ok := frozenPairs[i]; ok {
preserved := copySlide(beforeCopy[beforeIdx])
preserved.Freeze = true
afterCopy[i] = preserved
} else {
// A frozen slide without a counterpart is created from its
// markdown content. Freeze must be cleared because it would
// suppress content application on append.
afterSlide.Freeze = false
}
}

// Adjust slide count
adjustedBefore, adjustedAfter, err := adjustSlideCount(beforeCopy, afterCopy)
if err != nil {
return nil, fmt.Errorf("failed to adjust slide count: %w", err)
}

// Prevent actions from being generated from indexes that should be frozen.
for i, afterSlide := range adjustedAfter {
if afterSlide.Freeze {
adjustedBefore[i] = copySlide(afterSlide)
}
}

// Map slides algorithm
mapping, err := mapSlides(adjustedBefore, adjustedAfter)
if err != nil {
Expand Down
241 changes: 239 additions & 2 deletions action_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1659,8 +1659,8 @@ var tests = []struct {
},
{
Layout: "title",
Titles: []string{"Slide C"},
TitleBodies: toBodies([]string{"Slide C"}),
Titles: []string{"Slide B"},
TitleBodies: toBodies([]string{"Slide B"}),
},
},
},
Expand Down Expand Up @@ -1699,6 +1699,243 @@ var tests = []struct {
},
},
},
{
name: "freeze slide with insert before frozen slide",
before: Slides{
{
Layout: "title",
Titles: []string{"Slide 1"},
TitleBodies: toBodies([]string{"Slide 1"}),
},
{
Layout: "title",
Titles: []string{"Slide 2"},
TitleBodies: toBodies([]string{"Slide 2"}),
},
},
after: Slides{
{
Layout: "title",
Titles: []string{"Slide 1"},
TitleBodies: toBodies([]string{"Slide 1"}),
},
{
Layout: "title",
Titles: []string{"Slide NEW"},
TitleBodies: toBodies([]string{"Slide NEW"}),
},
{
Layout: "title",
Titles: []string{"Slide 2"},
TitleBodies: toBodies([]string{"Slide 2"}),
Freeze: true,
},
},
want: Slides{
{
Layout: "title",
Titles: []string{"Slide 1"},
TitleBodies: toBodies([]string{"Slide 1"}),
},
{
Layout: "title",
Titles: []string{"Slide NEW"},
TitleBodies: toBodies([]string{"Slide NEW"}),
},
{
Layout: "title",
Titles: []string{"Slide 2"},
TitleBodies: toBodies([]string{"Slide 2"}),
},
},
},
{
name: "freeze slide with delete before frozen slide",
before: Slides{
{
Layout: "title",
Titles: []string{"Slide 1"},
TitleBodies: toBodies([]string{"Slide 1"}),
},
{
Layout: "title",
Titles: []string{"Slide 2"},
TitleBodies: toBodies([]string{"Slide 2"}),
},
{
Layout: "title",
Titles: []string{"Slide 3"},
TitleBodies: toBodies([]string{"Slide 3"}),
},
},
after: Slides{
{
Layout: "title",
Titles: []string{"Slide 1"},
TitleBodies: toBodies([]string{"Slide 1"}),
},
{
Layout: "title",
Titles: []string{"Slide 3"},
TitleBodies: toBodies([]string{"Slide 3"}),
Freeze: true,
},
},
want: Slides{
{
Layout: "title",
Titles: []string{"Slide 1"},
TitleBodies: toBodies([]string{"Slide 1"}),
},
{
Layout: "title",
Titles: []string{"Slide 3"},
TitleBodies: toBodies([]string{"Slide 3"}),
},
},
},
{
// The actual content of the frozen slide has diverged from its
// markdown source (the typical reason for freezing). The diverged
// content must survive an insertion before the frozen slide.
name: "freeze diverged slide with insert before frozen slide",
before: Slides{
{
Layout: "title",
Titles: []string{"Slide 1"},
TitleBodies: toBodies([]string{"Slide 1"}),
},
{
Layout: "title",
Titles: []string{"Slide 2 edited manually"},
TitleBodies: toBodies([]string{"Slide 2 edited manually"}),
},
},
after: Slides{
{
Layout: "title",
Titles: []string{"Slide 1"},
TitleBodies: toBodies([]string{"Slide 1"}),
},
{
Layout: "title",
Titles: []string{"Slide NEW"},
TitleBodies: toBodies([]string{"Slide NEW"}),
},
{
Layout: "title",
Titles: []string{"Slide 2"},
TitleBodies: toBodies([]string{"Slide 2"}),
Freeze: true,
},
},
want: Slides{
{
Layout: "title",
Titles: []string{"Slide 1"},
TitleBodies: toBodies([]string{"Slide 1"}),
},
{
Layout: "title",
Titles: []string{"Slide NEW"},
TitleBodies: toBodies([]string{"Slide NEW"}),
},
{
Layout: "title",
Titles: []string{"Slide 2 edited manually"},
TitleBodies: toBodies([]string{"Slide 2 edited manually"}),
},
},
},
{
name: "freeze all slides with insert between",
before: Slides{
{
Layout: "title",
Titles: []string{"Slide P"},
TitleBodies: toBodies([]string{"Slide P"}),
},
{
Layout: "title",
Titles: []string{"Slide Q"},
TitleBodies: toBodies([]string{"Slide Q"}),
},
},
after: Slides{
{
Layout: "title",
Titles: []string{"Slide P"},
TitleBodies: toBodies([]string{"Slide P"}),
Freeze: true,
},
{
Layout: "title",
Titles: []string{"Slide NEW"},
TitleBodies: toBodies([]string{"Slide NEW"}),
},
{
Layout: "title",
Titles: []string{"Slide Q"},
TitleBodies: toBodies([]string{"Slide Q"}),
Freeze: true,
},
},
want: Slides{
{
Layout: "title",
Titles: []string{"Slide P"},
TitleBodies: toBodies([]string{"Slide P"}),
},
{
Layout: "title",
Titles: []string{"Slide NEW"},
TitleBodies: toBodies([]string{"Slide NEW"}),
},
{
Layout: "title",
Titles: []string{"Slide Q"},
TitleBodies: toBodies([]string{"Slide Q"}),
},
},
},
{
// A frozen slide that has no counterpart in the presentation is
// created from its markdown content. Freezing protects it from the
// next apply onward.
name: "freeze new slide without counterpart",
before: Slides{
{
Layout: "title",
Titles: []string{"Slide 1"},
TitleBodies: toBodies([]string{"Slide 1"}),
},
},
after: Slides{
{
Layout: "title",
Titles: []string{"Slide 1"},
TitleBodies: toBodies([]string{"Slide 1"}),
},
{
Layout: "title",
Titles: []string{"Slide F"},
TitleBodies: toBodies([]string{"Slide F"}),
Freeze: true,
},
},
want: Slides{
{
Layout: "title",
Titles: []string{"Slide 1"},
TitleBodies: toBodies([]string{"Slide 1"}),
},
{
Layout: "title",
Titles: []string{"Slide F"},
TitleBodies: toBodies([]string{"Slide F"}),
},
},
},
}

func TestGenerateActions(t *testing.T) {
Expand Down
Loading
Loading