93 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| /*
 | |
| Copyright 2015 Google Inc. All rights reserved.
 | |
| 
 | |
| 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.
 | |
| */
 | |
| 
 | |
| package commands
 | |
| 
 | |
| import (
 | |
| 	"errors"
 | |
| 	"flag"
 | |
| 	"fmt"
 | |
| 
 | |
| 	"github.com/google/git-appraise/repository"
 | |
| 	"github.com/google/git-appraise/review"
 | |
| )
 | |
| 
 | |
| var (
 | |
| 	pullFlagSet = flag.NewFlagSet("pull", flag.ExitOnError)
 | |
| 	pullVerify  = pullFlagSet.Bool("verify-signatures", false,
 | |
| 		"verify the signatures of pulled reviews")
 | |
| )
 | |
| 
 | |
| // pull updates the local git-notes used for reviews with those from a remote
 | |
| // repo.
 | |
| func pull(repo repository.Repo, args []string) error {
 | |
| 	pullFlagSet.Parse(args)
 | |
| 	pullArgs := pullFlagSet.Args()
 | |
| 
 | |
| 	if len(pullArgs) > 1 {
 | |
| 		return errors.New(
 | |
| 			"Only pulling from one remote at a time is supported.")
 | |
| 	}
 | |
| 
 | |
| 	remote := "origin"
 | |
| 	if len(pullArgs) == 1 {
 | |
| 		remote = pullArgs[0]
 | |
| 	}
 | |
| 	// This is the easy case. We're not checking signatures so just go the
 | |
| 	// normal route.
 | |
| 	if !*pullVerify {
 | |
| 		return repo.PullNotesAndArchive(remote, notesRefPattern,
 | |
| 			archiveRefPattern)
 | |
| 	}
 | |
| 
 | |
| 	// Otherwise, we collect the fetched reviewed revisions (their hashes), get
 | |
| 	// their reviews, and then one by one, verify them. If we make it through
 | |
| 	// the set, _then_ we merge the remote reference into the local branch.
 | |
| 	revisions, err := repo.FetchAndReturnNewReviewHashes(remote,
 | |
| 		notesRefPattern, archiveRefPattern)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	for _, revision := range revisions {
 | |
| 		rvw, err := review.GetSummaryViaRefs(repo,
 | |
| 			"refs/notes/"+remote+"/devtools/reviews",
 | |
| 			"refs/notes/"+remote+"/devtools/discuss", revision)
 | |
| 		if err != nil {
 | |
| 			return err
 | |
| 		}
 | |
| 		err = rvw.Verify()
 | |
| 		if err != nil {
 | |
| 			return err
 | |
| 		}
 | |
| 		fmt.Println("verified review:", revision)
 | |
| 	}
 | |
| 
 | |
| 	err = repo.MergeNotes(remote, notesRefPattern)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	return repo.MergeArchives(remote, archiveRefPattern)
 | |
| }
 | |
| 
 | |
| var pullCmd = &Command{
 | |
| 	Usage: func(arg0 string) {
 | |
| 		fmt.Printf("Usage: %s pull [<option>] [<remote>]\n\nOptions:\n", arg0)
 | |
| 		pullFlagSet.PrintDefaults()
 | |
| 	},
 | |
| 	RunMethod: func(repo repository.Repo, args []string) error {
 | |
| 		return pull(repo, args)
 | |
| 	},
 | |
| }
 |