fixed crash when committing filenames containing spaces

fixed crash in datetime conversion when showing "added" files
code refactor for SVNCommitForm and SVNDiffForm, code moved to SVNClasses
changed cursor to crHourGlass when recieving data for SVNCommitForm and SVNDiffForm
implemented Execute method in SVNCommitForm and calling this Asynchroneously

git-svn-id: trunk@17187 -
This commit is contained in:
darius 2008-11-03 10:04:59 +00:00
parent c8dafde3f3
commit ec0192e830
8 changed files with 134 additions and 132 deletions

View File

@ -24,7 +24,7 @@ interface
uses
Classes, SysUtils, ComCtrls, FileUtil, XMLCfg, LCLProc, Dialogs, Controls,
XMLRead, DOM, Process;
XMLRead, DOM, Process, StdCtrls, Forms;
resourcestring
rsAction = 'Action';
@ -143,6 +143,7 @@ type
var
SVNSettings: TSVNSettings;
procedure CmdLineToMemo(CmdLine: string; Memo: TMemo);
procedure SetColumn(ListView: TListView; ColNo, DefaultWidth: integer; AName: string; AutoSize: boolean = true);
function SVNExecutable: string;
function ReplaceLineEndings(const s, NewLineEnds: string): string;
@ -153,6 +154,81 @@ implementation
uses
SVNAddProjectForm;
procedure CmdLineToMemo(CmdLine: string; Memo: TMemo);
var
AProcess: TProcess;
BytesRead: LongInt;
n: LongInt;
M: TMemoryStream;
ProcessMsg: string;
procedure UpdateStringsFromStream(Strings: TStrings; var M: TMemoryStream; var BytesRead: LongInt);
var
s: string;
begin
SetLength(s, BytesRead);
M.Read(s[1], BytesRead);
ProcessMsg := ProcessMsg + ReplaceLineEndings(s, LineEnding);
Strings.Text := ProcessMsg;
M.SetSize(0);
BytesRead:=0;
end;
begin
ProcessMsg := '';
AProcess := TProcess.Create(nil);
AProcess.CommandLine := CmdLine;
debugln('CmdLineToMemo commandline=', AProcess.CommandLine);
AProcess.Options := AProcess.Options + [poUsePipes, poStdErrToOutput];
AProcess.ShowWindow := swoHIDE;
AProcess.Execute;
M := TMemoryStream.Create;
BytesRead := 0;
while AProcess.Running do
begin
// make sure we have room
M.SetSize(BytesRead + READ_BYTES);
// try reading it
n := AProcess.Output.Read((M.Memory + BytesRead)^, READ_BYTES);
if n > 0
then begin
Inc(BytesRead, n);
UpdateStringsFromStream(Memo.Lines, M, BytesRead);
Application.ProcessMessages;
end
else
// no data, wait 100 ms
Sleep(100);
end;
// read last part
repeat
// make sure we have room
M.SetSize(BytesRead + READ_BYTES);
// try reading it
n := AProcess.Output.Read((M.Memory + BytesRead)^, READ_BYTES);
if n > 0
then begin
Inc(BytesRead, n);
UpdateStringsFromStream(Memo.Lines, M, BytesRead);
Application.ProcessMessages;
end;
until n <= 0;
M.SetSize(BytesRead);
UpdateStringsFromStream(Memo.Lines, M, BytesRead);
AProcess.Free;
M.Free;
Memo.Cursor:=crDefault;
end;
procedure SetColumn(ListView: TListView; ColNo, DefaultWidth: integer; AName: string; AutoSize: boolean = true);
begin
ListView.Column[ColNo].Caption:=AName;

View File

@ -2,7 +2,7 @@ object SVNCommitFrm: TSVNCommitFrm
Left = 187
Height = 300
Top = 316
Width = 400
Width = 675
HelpContext = 0
ActiveControl = SVNCommitMemo
Align = alNone
@ -18,7 +18,7 @@ object SVNCommitFrm: TSVNCommitFrm
ChildSizing.VerticalSpacing = 0
ChildSizing.ControlsPerLine = 0
ClientHeight = 300
ClientWidth = 400
ClientWidth = 675
DockSite = False
DragKind = dkDrag
DragMode = dmManual
@ -26,6 +26,7 @@ object SVNCommitFrm: TSVNCommitFrm
Font.Height = 0
Font.Style = []
FormStyle = fsNormal
OnCreate = FormCreate
OnShow = FormShow
ParentBiDiMode = True
ParentFont = False
@ -38,7 +39,7 @@ object SVNCommitFrm: TSVNCommitFrm
Left = 6
Height = 48
Top = 252
Width = 388
Width = 663
HelpContext = 0
Align = alBottom
AutoSize = True
@ -50,10 +51,11 @@ object SVNCommitFrm: TSVNCommitFrm
Visible = True
end
object SVNCommitMemo: TMemo
Cursor = crHourGlass
Left = 6
Height = 240
Top = 6
Width = 388
Width = 663
HelpContext = 0
Align = alClient
Alignment = taLeftJustify

View File

@ -2,29 +2,30 @@
LazarusResources.Add('TSVNCommitFrm','FORMDATA',[
'TPF0'#13'TSVNCommitFrm'#12'SVNCommitFrm'#4'Left'#3#187#0#6'Height'#3','#1#3
+'Top'#3'<'#1#5'Width'#3#144#1#11'HelpContext'#2#0#13'ActiveControl'#7#13'SVN'
+'Top'#3'<'#1#5'Width'#3#163#2#11'HelpContext'#2#0#13'ActiveControl'#7#13'SVN'
+'CommitMemo'#5'Align'#7#6'alNone'#14'AllowDropFiles'#8#10'AutoScroll'#9#8'Au'
+'toSize'#8#11'BorderIcons'#11#12'biSystemMenu'#10'biMinimize'#10'biMaximize'
+#0#11'BorderStyle'#7#10'bsSizeable'#7'Caption'#6#12'SVNCommitFrm'#28'ChildSi'
+'zing.LeftRightSpacing'#2#0#28'ChildSizing.TopBottomSpacing'#2#0#29'ChildSiz'
+'ing.HorizontalSpacing'#2#0#27'ChildSizing.VerticalSpacing'#2#0#27'ChildSizi'
+'ng.ControlsPerLine'#2#0#12'ClientHeight'#3','#1#11'ClientWidth'#3#144#1#8'D'
+'ng.ControlsPerLine'#2#0#12'ClientHeight'#3','#1#11'ClientWidth'#3#163#2#8'D'
+'ockSite'#8#8'DragKind'#7#6'dkDrag'#8'DragMode'#7#8'dmManual'#7'Enabled'#9#11
+'Font.Height'#2#0#10'Font.Style'#11#0#9'FormStyle'#7#8'fsNormal'#6'OnShow'#7
+#8'FormShow'#14'ParentBiDiMode'#9#10'ParentFont'#8#8'Position'#7#14'poScreen'
+'Center'#13'ShowInTaskBar'#7#9'stDefault'#14'UseDockManager'#8#10'LCLVersion'
+#6#6'0.9.27'#11'WindowState'#7#8'wsNormal'#0#12'TButtonPanel'#11'ButtonPanel'
+#4'Left'#2#6#6'Height'#2'0'#3'Top'#3#252#0#5'Width'#3#132#1#11'HelpContext'#2
+#0#5'Align'#7#8'alBottom'#8'AutoSize'#9#11'ButtonOrder'#7#9'boDefault'#8'Tab'
+'Order'#2#0#13'DefaultButton'#7#4'pbOK'#11'ShowButtons'#11#4'pbOK'#0#10'Show'
+'Glyphs'#11#4'pbOK'#8'pbCancel'#7'pbClose'#6'pbHelp'#0#7'Visible'#9#0#0#5'TM'
+'emo'#13'SVNCommitMemo'#4'Left'#2#6#6'Height'#3#240#0#3'Top'#2#6#5'Width'#3
+#132#1#11'HelpContext'#2#0#5'Align'#7#8'alClient'#9'Alignment'#7#13'taLeftJu'
+'stify'#18'BorderSpacing.Left'#2#0#17'BorderSpacing.Top'#2#0#19'BorderSpacin'
+'g.Right'#2#0#20'BorderSpacing.Bottom'#2#0#20'BorderSpacing.Around'#2#6'!Bor'
+'derSpacing.CellAlignHorizontal'#7#7'ccaFill'#31'BorderSpacing.CellAlignVert'
+'ical'#7#7'ccaFill'#10'DragCursor'#7#6'crDrag'#8'DragMode'#7#8'dmManual'#7'E'
+'nabled'#9#9'MaxLength'#2#255#14'ParentBidiMode'#9#10'ParentFont'#9#8'ReadOn'
+'ly'#9#10'ScrollBars'#7#6'ssNone'#8'TabOrder'#2#1#7'TabStop'#9#7'Visible'#9
+#11'WantReturns'#9#8'WantTabs'#8#0#0#0
+'Font.Height'#2#0#10'Font.Style'#11#0#9'FormStyle'#7#8'fsNormal'#8'OnCreate'
+#7#10'FormCreate'#6'OnShow'#7#8'FormShow'#14'ParentBiDiMode'#9#10'ParentFont'
+#8#8'Position'#7#14'poScreenCenter'#13'ShowInTaskBar'#7#9'stDefault'#14'UseD'
+'ockManager'#8#10'LCLVersion'#6#6'0.9.27'#11'WindowState'#7#8'wsNormal'#0#12
+'TButtonPanel'#11'ButtonPanel'#4'Left'#2#6#6'Height'#2'0'#3'Top'#3#252#0#5'W'
+'idth'#3#151#2#11'HelpContext'#2#0#5'Align'#7#8'alBottom'#8'AutoSize'#9#11'B'
+'uttonOrder'#7#9'boDefault'#8'TabOrder'#2#0#13'DefaultButton'#7#4'pbOK'#11'S'
+'howButtons'#11#4'pbOK'#0#10'ShowGlyphs'#11#4'pbOK'#8'pbCancel'#7'pbClose'#6
+'pbHelp'#0#7'Visible'#9#0#0#5'TMemo'#13'SVNCommitMemo'#6'Cursor'#7#11'crHour'
+'Glass'#4'Left'#2#6#6'Height'#3#240#0#3'Top'#2#6#5'Width'#3#151#2#11'HelpCon'
+'text'#2#0#5'Align'#7#8'alClient'#9'Alignment'#7#13'taLeftJustify'#18'Border'
+'Spacing.Left'#2#0#17'BorderSpacing.Top'#2#0#19'BorderSpacing.Right'#2#0#20
+'BorderSpacing.Bottom'#2#0#20'BorderSpacing.Around'#2#6'!BorderSpacing.CellA'
+'lignHorizontal'#7#7'ccaFill'#31'BorderSpacing.CellAlignVertical'#7#7'ccaFil'
+'l'#10'DragCursor'#7#6'crDrag'#8'DragMode'#7#8'dmManual'#7'Enabled'#9#9'MaxL'
+'ength'#2#255#14'ParentBidiMode'#9#10'ParentFont'#9#8'ReadOnly'#9#10'ScrollB'
+'ars'#7#6'ssNone'#8'TabOrder'#2#1#7'TabStop'#9#7'Visible'#9#11'WantReturns'#9
+#8'WantTabs'#8#0#0#0
]);

View File

@ -15,12 +15,14 @@ type
TSVNCommitFrm = class(TForm)
ButtonPanel: TButtonPanel;
SVNCommitMemo: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ private declarations }
FSVNCommandLine: string;
public
{ public declarations }
procedure Execute(Data: PtrInt);
property SVNCommandLine: string read FSVNCommandLine write FSVNCommandLine;
end;
@ -46,51 +48,18 @@ end;
{ TSVNCommitFrm }
procedure TSVNCommitFrm.FormShow(Sender: TObject);
var
AProcess: TProcess;
M: TMemoryStream;
BytesRead: LongInt;
n: LongInt;
begin
Application.QueueAsyncCall(@Execute, 0);
end;
procedure TSVNCommitFrm.Execute(Data: PtrInt);
begin
CmdLineToMemo(SVNCommandLine, SVNCommitMemo);
end;
procedure TSVNCommitFrm.FormCreate(Sender: TObject);
begin
Caption := rsLazarusSVNCommit;
//commit the checked files
AProcess := TProcess.Create(nil);
AProcess.CommandLine := SVNCommandLine;
debugln('TSVNCommitFrm.FormShow CommandLine ' + AProcess.CommandLine);
AProcess.Options := AProcess.Options + [poUsePipes, poStdErrToOutput];
AProcess.ShowWindow := swoHIDE;
AProcess.Execute;
M := TMemoryStream.Create;
BytesRead := 0;
while AProcess.Running do
begin
// make sure we have room
M.SetSize(BytesRead + READ_BYTES);
// try reading it
n := AProcess.Output.Read((M.Memory + BytesRead)^, READ_BYTES);
if n > 0 then
Inc(BytesRead, n)
else
// no data, wait 100 ms
Sleep(100);
end;
// read last part
repeat
// make sure we have room
M.SetSize(BytesRead + READ_BYTES);
// try reading it
n := AProcess.Output.Read((M.Memory + BytesRead)^, READ_BYTES);
if n > 0 then
Inc(BytesRead, n);
until n <= 0;
M.SetSize(BytesRead);
SVNCommitMemo.Lines.LoadFromStream(M);
M.Free;
end;
initialization

View File

@ -119,6 +119,7 @@ object SVNDiffFrm: TSVNDiffFrm
end
end
object SVNDiffMemo: TMemo
Cursor = crHourGlass
Left = 6
Height = 356
Top = 6

View File

@ -1,5 +1,3 @@
{ This is an automatically generated lazarus resource file }
LazarusResources.Add('TSVNDiffFrm','FORMDATA',[
'TPF0'#11'TSVNDiffFrm'#10'SVNDiffFrm'#4'Left'#3#154#0#6'Height'#3#160#1#3'Top'
+#3#200#0#5'Width'#3#219#2#11'HelpContext'#2#0#13'ActiveControl'#7#11'SVNDiff'
@ -79,16 +77,16 @@ LazarusResources.Add('TSVNDiffFrm','FORMDATA',[
+'yout'#7#11'blGlyphLeft'#6'Margin'#2#255#11'ModalResult'#2#0#9'NumGlyphs'#2#0
+#7'OnClick'#7#15'SaveButtonClick'#10'ParentFont'#9#14'ParentShowHint'#9#7'Sp'
+'acing'#2#3#8'TabOrder'#2#4#7'TabStop'#9#7'Visible'#9#0#0#0#5'TMemo'#11'SVND'
+'iffMemo'#4'Left'#2#6#6'Height'#3'd'#1#3'Top'#2#6#5'Width'#3#207#2#11'HelpCo'
+'ntext'#2#0#5'Align'#7#8'alClient'#9'Alignment'#7#13'taLeftJustify'#18'Borde'
+'rSpacing.Left'#2#0#17'BorderSpacing.Top'#2#0#19'BorderSpacing.Right'#2#0#20
+'BorderSpacing.Bottom'#2#0#20'BorderSpacing.Around'#2#6'!BorderSpacing.CellA'
+'lignHorizontal'#7#7'ccaFill'#31'BorderSpacing.CellAlignVertical'#7#7'ccaFil'
+'l'#10'DragCursor'#7#6'crDrag'#8'DragMode'#7#8'dmManual'#7'Enabled'#9#11'Fon'
+'t.Height'#2#243#9'Font.Name'#6#7'Courier'#10'Font.Style'#11#0#9'MaxLength'#2
+#255#14'ParentBidiMode'#9#10'ParentFont'#8#8'ReadOnly'#8#10'ScrollBars'#7#10
+'ssAutoBoth'#8'TabOrder'#2#1#7'TabStop'#9#7'Visible'#9#11'WantReturns'#9#8'W'
+'antTabs'#8#0#0#11'TSaveDialog'#10'SaveDialog'#5'Width'#2#0#6'Height'#2#0#10
+'DefaultExt'#6#5'.diff'#6'Filter'#6#18'Patch|.diff;.patch'#4'left'#2#21#3'to'
+'p'#3'='#1#0#0#0
+'iffMemo'#6'Cursor'#7#11'crHourGlass'#4'Left'#2#6#6'Height'#3'd'#1#3'Top'#2#6
+#5'Width'#3#207#2#11'HelpContext'#2#0#5'Align'#7#8'alClient'#9'Alignment'#7
+#13'taLeftJustify'#18'BorderSpacing.Left'#2#0#17'BorderSpacing.Top'#2#0#19'B'
+'orderSpacing.Right'#2#0#20'BorderSpacing.Bottom'#2#0#20'BorderSpacing.Aroun'
+'d'#2#6'!BorderSpacing.CellAlignHorizontal'#7#7'ccaFill'#31'BorderSpacing.Ce'
+'llAlignVertical'#7#7'ccaFill'#10'DragCursor'#7#6'crDrag'#8'DragMode'#7#8'dm'
+'Manual'#7'Enabled'#9#11'Font.Height'#2#243#9'Font.Name'#6#7'Courier'#10'Fon'
+'t.Style'#11#0#9'MaxLength'#2#255#14'ParentBidiMode'#9#10'ParentFont'#8#8'Re'
+'adOnly'#8#10'ScrollBars'#7#10'ssAutoBoth'#8'TabOrder'#2#1#7'TabStop'#9#7'Vi'
+'sible'#9#11'WantReturns'#9#8'WantTabs'#8#0#0#11'TSaveDialog'#10'SaveDialog'
+#5'Width'#2#0#6'Height'#2#0#10'DefaultExt'#6#5'.diff'#6'Filter'#6#18'Patch|.'
+'diff;.patch'#4'left'#2#21#3'top'#3'='#1#0#0#0
]);

View File

@ -88,55 +88,9 @@ begin
end;
procedure TSVNDiffFrm.Execute(Data: PtrInt);
var
AProcess: TProcess;
BytesRead: LongInt;
n: LongInt;
M: TMemoryStream;
begin
AProcess := TProcess.Create(nil);
AProcess.CommandLine := SVNExecutable + ' diff ' + FSwitches + ' ' + RepositoryPath + ' --non-interactive';
debugln('TSVNDiffFrm.Execute commandline=', AProcess.CommandLine);
AProcess.Options := AProcess.Options + [poUsePipes, poStdErrToOutput];
AProcess.ShowWindow := swoHIDE;
AProcess.Execute;
M := TMemoryStream.Create;
BytesRead := 0;
while AProcess.Running do
begin
// make sure we have room
M.SetSize(BytesRead + READ_BYTES);
// try reading it
n := AProcess.Output.Read((M.Memory + BytesRead)^, READ_BYTES);
if n > 0
then begin
Inc(BytesRead, n);
end
else begin
// no data, wait 100 ms
Sleep(100);
end;
end;
// read last part
repeat
// make sure we have room
M.SetSize(BytesRead + READ_BYTES);
// try reading it
n := AProcess.Output.Read((M.Memory + BytesRead)^, READ_BYTES);
if n > 0
then begin
Inc(BytesRead, n);
end;
until n <= 0;
M.SetSize(BytesRead);
SVNDiffMemo.Lines.LoadFromStream(M);
SVNDiffMemo.Lines.Text := ReplaceLineEndings(SVNDiffMemo.Lines.Text, LineEnding);
AProcess.Free;
CmdLineToMemo(SVNExecutable + ' diff ' + FSwitches + ' ' + RepositoryPath + ' --non-interactive',
SVNDiffMemo);
end;
initialization

View File

@ -120,9 +120,9 @@ begin
if StatusItem^.Checked then
if pos(RepositoryPath,StatusItem^.Path) = 0 then
CmdLine := CmdLine + ' ' + AppendPathDelim(RepositoryPath) + StatusItem^.Path
CmdLine := CmdLine + ' ''' + AppendPathDelim(RepositoryPath) + StatusItem^.Path + ''''
else
CmdLine := CmdLine + ' ' + StatusItem^.Path;
CmdLine := CmdLine + ' ''' + StatusItem^.Path + '''';
end;
FileName := GetTempFileName('','');
@ -189,7 +189,8 @@ begin
SubItems.Add(StatusItem^.PropStatus);
//check if file is versioned
if LowerCase(StatusItem^.ItemStatus) <> 'unversioned' then
if (LowerCase(StatusItem^.ItemStatus) <> 'unversioned') and
(LowerCase(StatusItem^.ItemStatus) <> 'added') then
begin
//revision
SubItems.Add(IntToStr(StatusItem^.Revision));