#!/bin/bash

set -euo pipefail

readonly TEST_DIR=$(mktemp --tmpdir --directory lit-test.XXXXXX)

echo "== Using $TEST_DIR"
pushd "$TEST_DIR"

echo "== Initializing repository"
lit init

echo "== Creating the first commit"
cat >file1 <<-EOF
	This is the first line of the first file. 🚀
	This is the second line of the first file.
EOF

# Let's check the status. Should look something like this:
# Changes:
#   Add file1
lit status

# We expect the first commit to be identified as r0.
lit commit "Add file1"

echo "== Creating more commits"
echo >>file1 "A third line is added to the first file."

# Let's check the status again, just to be sure.
lit status

# This one would be r1.
lit commit "Extend file1"

echo >>file1 "A forth line is added."

# This should be r2.
lit commit "Extend file1 even further"

echo "== Displaying graph"

# o ← r2 Extend file1 even further
# o   r1 Extend file1
# o   r0 Add file1
lit log

echo "== Inspecting r0"
lit show r0

echo "== Switching to r0"
lit checkout r0

# Checking the file content.
diff -s file1 - <<-EOF
	This is the first line of the first file. 🚀
	This is the second line of the first file.
EOF

echo "== Switching back to r2"
lit checkout r2

# Checking the file content again.
diff -s file1 - <<-EOF
	This is the first line of the first file. 🚀
	This is the second line of the first file.
	A third line is added to the first file.
	A forth line is added.
EOF

echo "== Adding and discarding changes"
echo >>file1 "This fifth line should be gone in an instant."
lit checkout

# Let's confirm.
diff -s file1 - <<-EOF
	This is the first line of the first file. 🚀
	This is the second line of the first file.
	A third line is added to the first file.
	A forth line is added.
EOF

echo "== Creating another branch"
lit checkout r0
mkdir subfolder
cat >subfolder/file2 <<-EOF
	This is the first line of the second file.
	And another line in the second file.
EOF

# This should be r3.
lit commit "Add file2"

#   o ← r3 Add file2
# o │   r2 Extend file1 even further
# o │   r1 Extend file1
# o─┘   r0 Add file1
lit log

echo "== Going back"
lit checkout r2

# file2 should be gone.
test ! -f subfolder/file2

echo "== Merging (no conflict)"

# This creates a merge commit r4.
lit merge r3

# file2 should now be present.
diff -s subfolder/file2 - <<-EOF
	This is the first line of the second file.
	And another line in the second file.
EOF

# o←┐  ← r4 Merge r3 into r2
# │ └o   r3 Add file2
# o  │   r2 Extend file1 even further
# o  │   r1 Extend file1
# o──┘   r0 Add file1
lit log

echo "== Setting up a conflict"
echo >>file1 "Fifth line on top of r4."
lit commit "Extend file1 one way" # r5

lit checkout r3
echo >>file1 "Third line on top of r3."
lit commit "Extend file1 another way" # r6

#    o ← r6 Extend file1 another way
# o  │   r5 Extend file1 one way
# o←┐│   r4 Merge r3 into r2
# │ └o   r3 Add file2
# o  │    r2 Extend file1 even further
# o  │    r1 Extend file1
# o──┘    r0 Add file1
lit log

# Going back and merging.
lit checkout r5
lit merge r6 || true

# Let's check all file versions:
#   Current commit
diff -s file1 - <<-EOF
	This is the first line of the first file. 🚀
	This is the second line of the first file.
	A third line is added to the first file.
	A forth line is added.
	Fifth line on top of r4.
EOF

#   other branch
diff -s file1.r6 - <<-EOF
	This is the first line of the first file. 🚀
	This is the second line of the first file.
	Third line on top of r3.
EOF

#  common base
diff -s file1.r3 - <<-EOF
	This is the first line of the first file. 🚀
	This is the second line of the first file.
EOF

# Let's simulate some conflict resolution.
echo >>file1 "Sixth line added during merge conflict."

# Before continuing we need to cleanup the leftover files.
rm file1.r6 file1.r3

lit commit "Merge r6 into r5" # r7

# Let's verify the final result.

diff -s file1 - <<-EOF
	This is the first line of the first file. 🚀
	This is the second line of the first file.
	A third line is added to the first file.
	A forth line is added.
	Fifth line on top of r4.
	Sixth line added during merge conflict.
EOF

# o←┐   ← r7 Merge r6 into r5
# │ └─o   r6 Extend file1 another way
# o   │   r5 Extend file1 one way
# o←┐ │   r4 Merge r3 into r2
# │ └─o   r3 Add file2
# o   │   r2 Extend file1 even further
# o   │   r1 Extend file1
# o───┘   r0 Add file1
lit log

echo "== Cleanup"
popd
rm -r "$TEST_DIR"