// Copyright 2021 The Tint Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// roll-release is a tool to roll changes in Tint release branches into Dawn,
// and create new Tint release branches.
//
// See showUsage() for more information
package main

import (
	"encoding/hex"
	"flag"
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"os"
	"os/exec"
	"path/filepath"
	"regexp"
	"sort"
	"strconv"
	"strings"

	"dawn.googlesource.com/tint/tools/src/gerrit"
	"github.com/go-git/go-git/v5"
	"github.com/go-git/go-git/v5/config"
	"github.com/go-git/go-git/v5/plumbing"
	"github.com/go-git/go-git/v5/plumbing/transport"
	git_http "github.com/go-git/go-git/v5/plumbing/transport/http"
	"github.com/go-git/go-git/v5/storage/memory"
)

const (
	toolName            = "roll-release"
	gitCommitMsgHookURL = "https://gerrit-review.googlesource.com/tools/hooks/commit-msg"
	tintURL             = "https://dawn.googlesource.com/tint"
	dawnURL             = "https://dawn.googlesource.com/dawn"
	tintSubdirInDawn    = "third_party/tint"
	branchPrefix        = "chromium/"
	branchLegacyCutoff  = 4664 // Branch numbers < than this are ignored
)

type branches = map[string]plumbing.Hash

func main() {
	if err := run(); err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
}

func showUsage() {
	fmt.Printf(`
%[1]v is a tool to synchronize Dawn's release branches with Tint.

%[1]v will scan the release branches of both Dawn and Tint, and will:
* Create new Gerrit changes to roll new release branch changes from Tint into
  Dawn.
* Find and create missing Tint release branches, using the git hash of Tint in
  the DEPS file of the Dawn release branch.

%[1]v does not depend on the current state of the Tint checkout, nor will it
make any changes to the local checkout.

usage:
  %[1]v
`, toolName)
	flag.PrintDefaults()
	fmt.Println(``)
	os.Exit(1)
}

func run() error {
	dry := false
	flag.BoolVar(&dry, "dry", false, "perform a dry run")
	flag.Usage = showUsage
	flag.Parse()

	// This tool uses a mix of 'go-git' and the command line git.
	// go-git has the benefit of keeping the git information entirely in-memory,
	// but has issues working with chromiums tools and gerrit.
	// To create new release branches in Tint, we use 'go-git', so we need to
	// dig out the username and password.
	var auth transport.AuthMethod
	if user, pass := gerrit.LoadCredentials(); user != "" {
		auth = &git_http.BasicAuth{Username: user, Password: pass}
	} else {
		return fmt.Errorf("failed to fetch git credentials")
	}

	// Using in-memory repos, find all the tint and dawn release branches
	log.Println("Inspecting dawn and tint release branches...")
	var tint, dawn *git.Repository
	var tintBranches, dawnBranches branches
	for _, r := range []struct {
		name     string
		url      string
		repo     **git.Repository
		branches *branches
	}{
		{"tint", tintURL, &tint, &tintBranches},
		{"dawn", dawnURL, &dawn, &dawnBranches},
	} {
		repo, err := git.Init(memory.NewStorage(), nil)
		if err != nil {
			return fmt.Errorf("failed to create %v in-memory repo: %w", r.name, err)
		}
		remote, err := repo.CreateRemote(&config.RemoteConfig{
			Name: "origin",
			URLs: []string{r.url},
		})
		if err != nil {
			return fmt.Errorf("failed to add %v remote: %w", r.name, err)
		}
		refs, err := remote.List(&git.ListOptions{})
		if err != nil {
			return fmt.Errorf("failed to fetch %v branches: %w", r.name, err)
		}
		branches := branches{}
		for _, ref := range refs {
			if !ref.Name().IsBranch() {
				continue
			}
			name := ref.Name().Short()
			if strings.HasPrefix(name, branchPrefix) {
				branches[name] = ref.Hash()
			}
		}
		*r.repo = repo
		*r.branches = branches
	}

	// Find the release branches found in dawn, which are missing in tint.
	// Find the release branches in dawn that are behind HEAD of the
	// corresponding branch in tint.
	log.Println("Scanning dawn DEPS...")
	type roll struct {
		from, to plumbing.Hash
	}
	tintBranchesToCreate := branches{}      // branch name -> tint hash
	dawnBranchesToRoll := map[string]roll{} // branch name -> roll
	for name := range dawnBranches {
		if isBranchBefore(name, branchLegacyCutoff) {
			continue // Branch is earlier than we're interested in
		}
		deps, err := getDEPS(dawn, name)
		if err != nil {
			return err
		}
		depsTintHash, err := parseTintFromDEPS(deps)
		if err != nil {
			return err
		}

		if tintBranchHash, found := tintBranches[name]; found {
			if tintBranchHash != depsTintHash {
				dawnBranchesToRoll[name] = roll{from: depsTintHash, to: tintBranchHash}
			}
		} else {
			tintBranchesToCreate[name] = depsTintHash
		}
	}

	if dry {
		tasks := []string{}
		for name, sha := range tintBranchesToCreate {
			tasks = append(tasks, fmt.Sprintf("Create Tint release branch '%v' @ %v", name, sha))
		}
		for name, roll := range dawnBranchesToRoll {
			tasks = append(tasks, fmt.Sprintf("Roll Dawn release branch '%v' from %v to %v", name, roll.from, roll.to))
		}
		sort.Strings(tasks)
		fmt.Printf("%v was run with --dry. Run without --dry to:\n", toolName)
		for _, task := range tasks {
			fmt.Println(" >", task)
		}
		return nil
	}

	didSomething := false
	if n := len(tintBranchesToCreate); n > 0 {
		log.Println("Creating", n, "release branches in tint...")

		// In order to create the branches, we need to know what the DEPS
		// hashes are referring to. Perform an in-memory fetch of tint's main
		// branch.
		if _, err := fetch(tint, "main"); err != nil {
			return err
		}

		for name, sha := range tintBranchesToCreate {
			log.Println("Creating branch", name, "@", sha, "...")

			// Pushing a branch by SHA does not work, so we need to create a
			// local branch first. See https://github.com/go-git/go-git/issues/105
			src := plumbing.NewHashReference(plumbing.NewBranchReferenceName(name), sha)
			if err := tint.Storer.SetReference(src); err != nil {
				return fmt.Errorf("failed to create temporary branch: %w", err)
			}

			dst := plumbing.NewBranchReferenceName(name)
			refspec := config.RefSpec(src.Name() + ":" + dst)
			err := tint.Push(&git.PushOptions{
				RefSpecs: []config.RefSpec{refspec},
				Progress: os.Stdout,
				Auth:     auth,
			})
			if err != nil && err != git.NoErrAlreadyUpToDate {
				return fmt.Errorf("failed to push branch: %w", err)
			}
		}
		didSomething = true
	}

	if n := len(dawnBranchesToRoll); n > 0 {
		log.Println("Rolling", n, "release branches in dawn...")

		// Fetch the change-id hook script
		commitMsgHookResp, err := http.Get(gitCommitMsgHookURL)
		if err != nil {
			return fmt.Errorf("failed to fetch the git commit message hook from '%v': %w", gitCommitMsgHookURL, err)
		}
		commitMsgHook, err := ioutil.ReadAll(commitMsgHookResp.Body)
		if err != nil {
			return fmt.Errorf("failed to fetch the git commit message hook from '%v': %w", gitCommitMsgHookURL, err)
		}

		for name, roll := range dawnBranchesToRoll {
			log.Println("Rolling branch", name, "from tint", roll.from, "to", roll.to, "...")
			dir, err := ioutil.TempDir("", "dawn-roll")
			if err != nil {
				return err
			}
			defer os.RemoveAll(dir)

			// Clone dawn into dir
			if err := call(dir, "git", "clone", "--depth", "1", "-b", name, dawnURL, "."); err != nil {
				return fmt.Errorf("failed to clone dawn branch %v: %w", name, err)
			}

			// Copy the Change-Id hook into the dawn directory
			gitHooksDir := filepath.Join(dir, ".git", "hooks")
			if err := os.MkdirAll(gitHooksDir, 0777); err != nil {
				return fmt.Errorf("failed create commit hooks directory: %w", err)
			}
			if err := ioutil.WriteFile(filepath.Join(gitHooksDir, "commit-msg"), commitMsgHook, 0777); err != nil {
				return fmt.Errorf("failed install commit message hook: %w", err)
			}

			// Clone tint into third_party directory of dawn
			tintDir := filepath.Join(dir, tintSubdirInDawn)
			if err := os.MkdirAll(tintDir, 0777); err != nil {
				return fmt.Errorf("failed to create directory %v: %w", tintDir, err)
			}
			if err := call(tintDir, "git", "clone", "-b", name, tintURL, "."); err != nil {
				return fmt.Errorf("failed to clone tint hash %v: %w", roll.from, err)
			}

			// Checkout tint at roll.from
			if err := call(tintDir, "git", "checkout", roll.from); err != nil {
				return fmt.Errorf("failed to checkout tint at %v: %w", roll.from, err)
			}

			// Use roll-dep to roll tint to roll.to
			if err := call(dir, "roll-dep", "--ignore-dirty-tree", fmt.Sprintf("--roll-to=%s", roll.to), tintSubdirInDawn); err != nil {
				return err
			}

			// Push the change to gerrit
			if err := call(dir, "git", "push", "origin", "HEAD:refs/for/"+name); err != nil {
				return fmt.Errorf("failed to push roll to gerrit: %w", err)
			}
		}
		didSomething = true
	}

	if !didSomething {
		log.Println("Everything up to date")
	} else {
		log.Println("Done")
	}
	return nil
}

// returns true if the branch name contains a branch number less than 'version'
func isBranchBefore(name string, version int) bool {
	n, err := strconv.Atoi(strings.TrimPrefix(name, branchPrefix))
	if err != nil {
		return false
	}
	return n < version
}

// call invokes the executable 'exe' with the given arguments in the working
// directory 'dir'.
func call(dir, exe string, args ...interface{}) error {
	s := make([]string, len(args))
	for i, a := range args {
		s[i] = fmt.Sprint(a)
	}
	cmd := exec.Command(exe, s...)
	cmd.Dir = dir
	cmd.Stdout = os.Stdout
	cmd.Stderr = os.Stderr
	if err := cmd.Run(); err != nil {
		return fmt.Errorf("%v returned %v", cmd, err)
	}
	return nil
}

// getDEPS returns the content of the DEPS file for the given branch.
func getDEPS(r *git.Repository, branch string) (string, error) {
	hash, err := fetch(r, branch)
	if err != nil {
		return "", err
	}
	commit, err := r.CommitObject(hash)
	if err != nil {
		return "", fmt.Errorf("failed to fetch commit: %w", err)
	}
	tree, err := commit.Tree()
	if err != nil {
		return "", fmt.Errorf("failed to fetch tree: %w", err)
	}
	deps, err := tree.File("DEPS")
	if err != nil {
		return "", fmt.Errorf("failed to find DEPS: %w", err)
	}
	return deps.Contents()
}

// fetch performs a git-fetch of the given branch into 'r', returning the
// fetched branch's hash.
func fetch(r *git.Repository, branch string) (plumbing.Hash, error) {
	src := plumbing.NewBranchReferenceName(branch)
	dst := plumbing.NewRemoteReferenceName("origin", branch)
	err := r.Fetch(&git.FetchOptions{
		RefSpecs: []config.RefSpec{config.RefSpec("+" + src + ":" + dst)},
	})
	if err != nil {
		return plumbing.Hash{}, fmt.Errorf("failed to fetch branch %v: %w", branch, err)
	}
	ref, err := r.Reference(plumbing.ReferenceName(dst), true)
	if err != nil {
		return plumbing.Hash{}, fmt.Errorf("failed to resolve branch %v: %w", branch, err)
	}
	return ref.Hash(), nil
}

var reDEPSTintVersion = regexp.MustCompile("tint@([0-9a-fA-F]*)")

// parseTintFromDEPS returns the tint hash from the DEPS file content 'deps'
func parseTintFromDEPS(deps string) (plumbing.Hash, error) {
	m := reDEPSTintVersion.FindStringSubmatch(deps)
	if len(m) != 2 {
		return plumbing.Hash{}, fmt.Errorf("failed to find tint hash in DEPS")
	}
	b, err := hex.DecodeString(m[1])
	if err != nil {
		return plumbing.Hash{}, fmt.Errorf("failed to find parse tint hash in DEPS: %w", err)
	}
	var h plumbing.Hash
	copy(h[:], b)
	return h, nil
}
