Index: src/TortoiseProc/LogDlg.cpp
===================================================================
--- src/TortoiseProc/LogDlg.cpp	(revision 2503)
+++ src/TortoiseProc/LogDlg.cpp	(working copy)
@@ -482,6 +482,43 @@
 	*pResult = 0;
 }
 
+BOOL CLogDlg::DiffPossible(CString & selItemText, long rev)
+{
+	// dangerous assumption that translation (of "added" / "deleted" etc...) doesn't contain spaces
+	// can we really rely on that?
+	CString action = selItemText.Left(selItemText.Find(' '));
+	
+	CString added, deleted;
+	added.LoadString(IDS_SVNACTION_ADD);
+	deleted.LoadString(IDS_SVNACTION_DELETE);
+
+	if ((rev > 1)&&(action.Compare(added)!=0)&&(action.Compare(deleted)!=0))
+	{
+		return TRUE;
+	}
+	else if (action.Compare(added)==0) // file is added, was it added with history?
+	{
+		// SVN appends (from original_path:revision) if a file was added with history
+		
+		// NOTE, the colon in this string ":" cannot occur in a real filename, so that is
+		// the only way to tell if it's an added file with history
+		// (is there any better way to find out?)
+
+		int idx = selItemText.Find(_T(" (from "));
+		if (idx > 0)
+		{
+			CString from = selItemText.Mid(idx);
+			if (from.Find(_T(":")) > 0)
+			{
+				// a real filename doesn't contain a colon,
+				// so it HAS to be an added file with history
+				return TRUE;
+			}
+		}
+	}
+	return FALSE;
+}
+
 void CLogDlg::OnContextMenu(CWnd* pWnd, CPoint point)
 {
 //#region m_LogList
@@ -916,11 +953,7 @@
 			if (m_LogMsgCtrl.GetSelectedCount() == 1)
 			{
 				temp = m_LogMsgCtrl.GetItemText(selIndex, 0);
-				temp = temp.Left(temp.Find(' '));
-				CString t, tt;
-				t.LoadString(IDS_SVNACTION_ADD);
-				tt.LoadString(IDS_SVNACTION_DELETE);
-				if ((rev > 1)&&(temp.Compare(t)!=0)&&(temp.Compare(tt)!=0))
+				if (DiffPossible(temp, rev))
 				{
 					temp.LoadString(IDS_LOG_POPUP_DIFF);
 					popup.AppendMenu(MF_STRING | MF_ENABLED, ID_DIFF, temp);
@@ -1388,11 +1421,8 @@
 		return;
 	long rev = m_arRevs.GetAt(s);
 	CString temp = m_LogMsgCtrl.GetItemText(selIndex, 0);
-	temp = temp.Left(temp.Find(' '));
-	CString t, tt;
-	t.LoadString(IDS_SVNACTION_ADD);
-	tt.LoadString(IDS_SVNACTION_DELETE);
-	if ((rev > 1)&&(temp.Compare(t)!=0)&&(temp.Compare(tt)!=0))
+
+	if (DiffPossible(temp, rev))
 	{
 		DoDiffFromLog(selIndex, rev);
 	}
@@ -1428,14 +1458,38 @@
 	CString temp = m_LogMsgCtrl.GetItemText(selIndex, 0);
 	m_bCancelled = FALSE;
 	filepath = GetRepositoryRoot(CTSVNPath(filepath));
-	temp = temp.Mid(temp.Find(' '));
-	if (temp.Find(_T(" (from "))>=0)
+	temp = temp.Mid(temp.Find(' ')); // BUGBUG?: relying on the fact that 
+	                                 // there is exactly one word before filename
+	                                 // Isn't that string (added, deleted etc...) translated? 
+									 // Translation can have different amount of words...?
+
+	CString firstfile;
+	CString secondfile;
+	long fromrev;
+
+	if (temp.Find(_T(" (from "))>=0) // is it an added file with history?
 	{
-		temp = temp.Left(temp.Find(_T(" (from "))-1);
+		int idx = temp.Find(_T(" (from "));
+		
+		firstfile = temp.Left(idx);
+		secondfile = temp.Mid(idx + 7); // skip the " (from " part
+		CString fromrevstring = secondfile.Mid(secondfile.Find(_T(":")) + 1);
+		fromrev = _wtol(fromrevstring);
+		secondfile = secondfile.Left(secondfile.Find(_T(":")));
 	}
-	temp = temp.Trim();
-	filepath += temp;
-	StartDiff(CTSVNPath(filepath), rev, CTSVNPath(filepath), rev-1);
+	else
+	{
+		firstfile = temp;
+		secondfile = temp;
+		fromrev = rev - 1;
+	}
+	firstfile = firstfile.Trim();
+	secondfile = secondfile.Trim();
+	
+	firstfile = filepath + firstfile;
+	secondfile = filepath + secondfile;
+
+	StartDiff(CTSVNPath(firstfile), rev, CTSVNPath(secondfile), fromrev);
 	theApp.DoWaitCursor(-1);
 	GetDlgItem(IDOK)->EnableWindow(TRUE);
 }
Index: src/TortoiseProc/LogDlg.h
===================================================================
--- src/TortoiseProc/LogDlg.h	(revision 2503)
+++ src/TortoiseProc/LogDlg.h	(working copy)
@@ -115,6 +115,7 @@
 private:
 	static UINT LogThreadEntry(LPVOID pVoid);
 	UINT LogThread();
+	BOOL DiffPossible(CString & selItemText, long rev);
 
 public:
 	CWnd *		m_pNotifyWindow;
