P4Lists.cpp. #1

  • //
  • guest/
  • YourUncleBob/
  • p4win/
  • main/
  • gui/
  • P4Lists.cpp.
  • View
  • Commits
  • Open Download .zip Download (4 KB)
//
// Copyright 1997 Nicholas J. Irias.  All rights reserved.
//
//

// P4Lists.cpp : implementation file
//

#include "stdafx.h"
#include "p4win.h"
#include "P4Lists.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


/////////////////////////////////////////////////////////////////////////////
// CHistory    A collection of CRevisions, to contain all results from "P4 filelog -l"

IMPLEMENT_DYNCREATE(CRevision, CObject)

CRevision::CRevision()
{
	m_RevisionNum = m_ChangeNum = m_FNbr = 0;
}


CRevision::~CRevision()
{
	
}


BOOL CRevision::Create(LPCTSTR fname, int fnbr, LPCTSTR text, LPCTSTR branchInfo)
{
	CString buf(text);

	// Parsing: example serverOutput follows
	//
	//... #13 change 36 edit on 01/10/1997 by NIRIAS@ELWOOD
	//
    //    Added view function, but have not yet added capability to track and delete
    //    temp files after viewing	

	// Find the revision and change numbers
	int pound=buf.Find(_T("#"));
	int change=buf.Find(_T("change"));
	if(pound < 0 || change < 0 || change < pound)
		return FALSE; 
	
	change+=6;   // skip over "change "
	// Find the action word ('edit', 'add',...)
	int action;
	for(action=change; action < buf.GetLength(); action++)
	{
		if(!_istdigit(buf[action]) && buf[action] != _T(' ') && buf[action] != _T('\t'))
			break;  
	}
	if(action == buf.GetLength())
		return FALSE;

	// Find the date
	int date;
	for(date = action; date < buf.GetLength(); date++)
	{
		if(_istdigit(buf[date]))
			break;  
	}
	if(date == buf.GetLength())
		return FALSE;

	// store what was found, then cut off all chars up to date
	m_FName = fname;
	m_FNbr  = fnbr;
	m_RevisionNum = _ttoi(buf.Mid(pound+1,10));
	m_ChangeNum  = _ttoi(buf.Mid(change,10));
	m_ChangeType = buf.Mid(action, date-1-action);
	m_ChangeType = m_ChangeType.Left(m_ChangeType.FindOneOf(_T(" \t")));

	// Find the user
	int user = buf.Find(_T(" by "));
	if (user == -1)
		user = buf.GetLength();

	// The Date is between 'date' and 'user'
	m_Date = buf.Mid(date, user - date);

	// skip over " by " and trim off date
	user += sizeof(_T(" by "))/sizeof(TCHAR)-1;
	if (user > buf.GetLength())
		user = buf.GetLength();
	m_User = buf = buf.Mid(user);
	
	int whtsp;
	if ((whtsp = m_User.FindOneOf(_T(" \t\r\n"))) >= 0)
		m_User = m_User.Left(whtsp);

	// Find the description
	int	desc=m_User.GetLength();
	for( ; desc < buf.GetLength(); desc++)
	{
		if(buf[desc] != _T(' ') && buf[desc] != _T('\t') && buf[desc] != _T('\n') && buf[desc] != _T('\r'))
			break;  
	}

	// User might have entered a blank description
	if(desc == buf.GetLength())
		m_ChangeDescription=LoadStringResource(IDS_NO_DESCRIPTION);
	else
		m_ChangeDescription=RemoveTabs(buf.Mid(desc));

	if( lstrlen(branchInfo) > 0 )
	{
		m_ChangeType += (m_ChangeType == _T("integrate") || m_ChangeType == _T("branch")) ? _T(": ") : _T("; ");
		m_ChangeType += branchInfo;
	}
	
	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CHistory    A collection of CRevisions, to contain all results from "P4 filelog -l"

CHistory::CHistory()
{
	m_pList= new CObList; 
}

CHistory::~CHistory()
{
	Clear();
	delete m_pList;
}

void CHistory::Clear()
{
	while(!m_pList->IsEmpty())
	{
		if(m_pList->GetHead()->IsKindOf(RUNTIME_CLASS(CRevision)))
			delete m_pList->GetHead();
		m_pList->RemoveHead();
	}
	m_FileName=_T("");
	m_pos=NULL;
}

BOOL CHistory::AddRevision(LPCTSTR fname, int fnbr, LPCTSTR desc, LPCTSTR branchInfo)
{
	ASSERT( _tcsncmp(fname, _T("//"), 2)==0 );
	
	if( m_FileName.IsEmpty() )
		m_FileName=fname;
	
	CRevision *rev=new CRevision;
	if(rev->Create(fname, fnbr, desc, branchInfo))
	{
		m_pList->AddHead(rev);
		return TRUE;
	}
	else
	{
		delete rev;
		return FALSE;
	}
}



CRevision *CHistory::GetLatestRevision()
{
	ASSERT(!m_pList->IsEmpty());

	m_pos=m_pList->GetHeadPosition();
	// This looks wrong, but m_pos++ happens AFTER the get
	return (CRevision *) m_pList->GetNext(m_pos);
}


CRevision *CHistory::GetNextRevision()
{
	ASSERT(!m_pList->IsEmpty());
	ASSERT(m_pos != NULL);

	return (CRevision *) m_pList->GetNext(m_pos);
}

	
CRevision *CHistory::GetHeadRevision()
{
	ASSERT(!m_pList->IsEmpty());

	m_pos=m_pList->GetTailPosition();
	// This looks wrong, but m_pos++ happens AFTER the get
	return (CRevision *) m_pList->GetPrev(m_pos);
}


CRevision *CHistory::GetPrevRevision()
{
	if (m_pList->IsEmpty() || m_pos == NULL)
		return NULL;

	return (CRevision *) m_pList->GetPrev(m_pos);
}

	
int CHistory::GetRevisionCount()
{
	return m_pList->GetCount();
}


CString CHistory::GetFileName()
{
	return m_FileName;
}

# Change User Description Committed
#1 19924 YourUncleBob Populate -o //guest/perforce_software/p4win/...
//guest/YourUncleBob/p4win/.....
//guest/perforce_software/p4win/main/gui/P4Lists.cpp
#1 16169 perforce_software Move files to follow new path scheme for branches.
//guest/perforce_software/p4win/gui/P4Lists.cpp
#1 8562 Matt Attaway These feet never stop running.

Initial commit of the P4Win source code.  To the best of our knowledge this
compiles and runs using the 2013.3 P4 API and VS 2010. Expect a few changes
as we refine the build process. Please post any build issues to the forums.