|  | @@ -85,6 +85,20 @@ func (pr *PullRequest) AfterSet(colName string, _ xorm.Cell) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // Note: don't try to get Issue because will end up recursive querying.
 | 
	
		
			
				|  |  |  func (pr *PullRequest) loadAttributes(e Engine) (err error) {
 | 
	
		
			
				|  |  | +	if pr.HeadRepo == nil {
 | 
	
		
			
				|  |  | +		pr.HeadRepo, err = getRepositoryByID(e, pr.HeadRepoID)
 | 
	
		
			
				|  |  | +		if err != nil && !IsErrRepoNotExist(err) {
 | 
	
		
			
				|  |  | +			return fmt.Errorf("getRepositoryByID.(HeadRepo) [%d]: %v", pr.HeadRepoID, err)
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if pr.BaseRepo == nil {
 | 
	
		
			
				|  |  | +		pr.BaseRepo, err = getRepositoryByID(e, pr.BaseRepoID)
 | 
	
		
			
				|  |  | +		if err != nil {
 | 
	
		
			
				|  |  | +			return fmt.Errorf("getRepositoryByID.(BaseRepo) [%d]: %v", pr.BaseRepoID, err)
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  	if pr.HasMerged && pr.Merger == nil {
 | 
	
		
			
				|  |  |  		pr.Merger, err = getUserByID(e, pr.MergerID)
 | 
	
		
			
				|  |  |  		if IsErrUserNotExist(err) {
 | 
	
	
		
			
				|  | @@ -112,11 +126,19 @@ func (pr *PullRequest) LoadIssue() (err error) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // This method assumes following fields have been assigned with valid values:
 | 
	
		
			
				|  |  | -// Required - Issue
 | 
	
		
			
				|  |  | -// Required - HeadRepo
 | 
	
		
			
				|  |  | -// Required - BaseRepo
 | 
	
		
			
				|  |  | -// Optional - Merger
 | 
	
		
			
				|  |  | +// Required - Issue, BaseRepo
 | 
	
		
			
				|  |  | +// Optional - HeadRepo, Merger
 | 
	
		
			
				|  |  |  func (pr *PullRequest) APIFormat() *api.PullRequest {
 | 
	
		
			
				|  |  | +	// In case of head repo has been deleted.
 | 
	
		
			
				|  |  | +	var apiHeadRepo *api.Repository
 | 
	
		
			
				|  |  | +	if pr.HeadRepo == nil {
 | 
	
		
			
				|  |  | +		apiHeadRepo = &api.Repository{
 | 
	
		
			
				|  |  | +			Name: "deleted",
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	} else {
 | 
	
		
			
				|  |  | +		apiHeadRepo = pr.HeadRepo.APIFormat(nil)
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  	apiIssue := pr.Issue.APIFormat()
 | 
	
		
			
				|  |  |  	apiPullRequest := &api.PullRequest{
 | 
	
		
			
				|  |  |  		ID:         pr.ID,
 | 
	
	
		
			
				|  | @@ -130,7 +152,7 @@ func (pr *PullRequest) APIFormat() *api.PullRequest {
 | 
	
		
			
				|  |  |  		State:      apiIssue.State,
 | 
	
		
			
				|  |  |  		Comments:   apiIssue.Comments,
 | 
	
		
			
				|  |  |  		HeadBranch: pr.HeadBranch,
 | 
	
		
			
				|  |  | -		HeadRepo:   pr.HeadRepo.APIFormat(nil),
 | 
	
		
			
				|  |  | +		HeadRepo:   apiHeadRepo,
 | 
	
		
			
				|  |  |  		BaseBranch: pr.BaseBranch,
 | 
	
		
			
				|  |  |  		BaseRepo:   pr.BaseRepo.APIFormat(nil),
 | 
	
		
			
				|  |  |  		HTMLURL:    pr.Issue.HTMLURL(),
 | 
	
	
		
			
				|  | @@ -150,30 +172,6 @@ func (pr *PullRequest) APIFormat() *api.PullRequest {
 | 
	
		
			
				|  |  |  	return apiPullRequest
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -func (pr *PullRequest) getHeadRepo(e Engine) (err error) {
 | 
	
		
			
				|  |  | -	pr.HeadRepo, err = getRepositoryByID(e, pr.HeadRepoID)
 | 
	
		
			
				|  |  | -	if err != nil && !IsErrRepoNotExist(err) {
 | 
	
		
			
				|  |  | -		return fmt.Errorf("getRepositoryByID(head): %v", err)
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	return nil
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -func (pr *PullRequest) GetHeadRepo() error {
 | 
	
		
			
				|  |  | -	return pr.getHeadRepo(x)
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -func (pr *PullRequest) GetBaseRepo() (err error) {
 | 
	
		
			
				|  |  | -	if pr.BaseRepo != nil {
 | 
	
		
			
				|  |  | -		return nil
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	pr.BaseRepo, err = GetRepositoryByID(pr.BaseRepoID)
 | 
	
		
			
				|  |  | -	if err != nil {
 | 
	
		
			
				|  |  | -		return fmt.Errorf("GetRepositoryByID(base): %v", err)
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	return nil
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  // IsChecking returns true if this pull request is still checking conflict.
 | 
	
		
			
				|  |  |  func (pr *PullRequest) IsChecking() bool {
 | 
	
		
			
				|  |  |  	return pr.Status == PULL_REQUEST_STATUS_CHECKING
 | 
	
	
		
			
				|  | @@ -187,12 +185,6 @@ func (pr *PullRequest) CanAutoMerge() bool {
 | 
	
		
			
				|  |  |  // Merge merges pull request to base repository.
 | 
	
		
			
				|  |  |  // FIXME: add repoWorkingPull make sure two merges does not happen at same time.
 | 
	
		
			
				|  |  |  func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository) (err error) {
 | 
	
		
			
				|  |  | -	if err = pr.GetHeadRepo(); err != nil {
 | 
	
		
			
				|  |  | -		return fmt.Errorf("GetHeadRepo: %v", err)
 | 
	
		
			
				|  |  | -	} else if err = pr.GetBaseRepo(); err != nil {
 | 
	
		
			
				|  |  | -		return fmt.Errorf("GetBaseRepo: %v", err)
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  	defer func() {
 | 
	
		
			
				|  |  |  		go HookQueue.Add(pr.BaseRepo.ID)
 | 
	
		
			
				|  |  |  		go AddTestPullRequestTask(doer, pr.BaseRepo.ID, pr.BaseBranch, false)
 | 
	
	
		
			
				|  | @@ -548,17 +540,11 @@ func (pr *PullRequest) UpdateCols(cols ...string) error {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // UpdatePatch generates and saves a new patch.
 | 
	
		
			
				|  |  |  func (pr *PullRequest) UpdatePatch() (err error) {
 | 
	
		
			
				|  |  | -	if err = pr.GetHeadRepo(); err != nil {
 | 
	
		
			
				|  |  | -		return fmt.Errorf("GetHeadRepo: %v", err)
 | 
	
		
			
				|  |  | -	} else if pr.HeadRepo == nil {
 | 
	
		
			
				|  |  | +	if pr.HeadRepo == nil {
 | 
	
		
			
				|  |  |  		log.Trace("PullRequest[%d].UpdatePatch: ignored cruppted data", pr.ID)
 | 
	
		
			
				|  |  |  		return nil
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	if err = pr.GetBaseRepo(); err != nil {
 | 
	
		
			
				|  |  | -		return fmt.Errorf("GetBaseRepo: %v", err)
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  	headGitRepo, err := git.OpenRepository(pr.HeadRepo.RepoPath())
 | 
	
		
			
				|  |  |  	if err != nil {
 | 
	
		
			
				|  |  |  		return fmt.Errorf("OpenRepository: %v", err)
 | 
	
	
		
			
				|  | @@ -763,8 +749,8 @@ func TestPullRequests() {
 | 
	
		
			
				|  |  |  		func(idx int, bean interface{}) error {
 | 
	
		
			
				|  |  |  			pr := bean.(*PullRequest)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -			if err := pr.GetBaseRepo(); err != nil {
 | 
	
		
			
				|  |  | -				log.Error(3, "GetBaseRepo: %v", err)
 | 
	
		
			
				|  |  | +			if err := pr.LoadAttributes(); err != nil {
 | 
	
		
			
				|  |  | +				log.Error(3, "LoadAttributes: %v", err)
 | 
	
		
			
				|  |  |  				return nil
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  |  
 |