~ubuntu-branches/ubuntu/saucy/lazarus/saucy

« back to all changes in this revision

Viewing changes to components/fppkg/svn/svncommand.pas

  • Committer: Package Import Robot
  • Author(s): Paul Gevers, Abou Al Montacir, Bart Martens, Paul Gevers
  • Date: 2013-06-08 14:12:17 UTC
  • mfrom: (1.1.9)
  • Revision ID: package-import@ubuntu.com-20130608141217-7k0cy9id8ifcnutc
Tags: 1.0.8+dfsg-1
[ Abou Al Montacir ]
* New upstream major release and multiple maintenace release offering many
  fixes and new features marking a new milestone for the Lazarus development
  and its stability level.
  - The detailed list of changes can be found here:
    http://wiki.lazarus.freepascal.org/Lazarus_1.0_release_notes
    http://wiki.lazarus.freepascal.org/Lazarus_1.0_fixes_branch
* LCL changes:
  - LCL is now a normal package.
      + Platform independent parts of the LCL are now in the package LCLBase
      + LCL is automatically recompiled when switching the target platform,
        unless pre-compiled binaries for this target are already installed.
      + No impact on existing projects.
      + Linker options needed by LCL are no more added to projects that do
        not use the LCL package.
  - Minor changes in LCL basic classes behaviour
      + TCustomForm.Create raises an exception if a form resource is not
        found.
      + TNotebook and TPage: a new implementation of these classes was added.
      + TDBNavigator: It is now possible to have focusable buttons by setting
        Options = [navFocusableButtons] and TabStop = True, useful for
        accessibility and for devices with neither mouse nor touch screen.
      + Names of TControlBorderSpacing.GetSideSpace and GetSpace were swapped
        and are now consistent. GetSideSpace = Around + GetSpace.
      + TForm.WindowState=wsFullscreen was added
      + TCanvas.TextFitInfo was added to calculate how many characters will
        fit into a specified Width. Useful for word-wrapping calculations.
      + TControl.GetColorResolvingParent and
        TControl.GetRGBColorResolvingParent were added, simplifying the work
        to obtain the final color of the control while resolving clDefault
        and the ParentColor.
      + LCLIntf.GetTextExtentExPoint now has a good default implementation
        which works in any platform not providing a specific implementation.
        However, Widgetset specific implementation is better, when available.
      + TTabControl was reorganized. Now it has the correct class hierarchy
        and inherits from TCustomTabControl as it should.
  - New unit in the LCL:
      + lazdialogs.pas: adds non-native versions of various native dialogs,
        for example TLazOpenDialog, TLazSaveDialog, TLazSelectDirectoryDialog.
        It is used by widgetsets which either do not have a native dialog, or
        do not wish to use it because it is limited. These dialogs can also be
        used by user applications directly.
      + lazdeviceapis.pas: offers an interface to more hardware devices such
        as the accelerometer, GPS, etc. See LazDeviceAPIs
      + lazcanvas.pas: provides a TFPImageCanvas descendent implementing
        drawing in a LCL-compatible way, but 100% in Pascal.
      + lazregions.pas. LazRegions is a wholly Pascal implementation of
        regions for canvas clipping, event clipping, finding in which control
        of a region tree one an event should reach, for drawing polygons, etc.
      + customdrawncontrols.pas, customdrawndrawers.pas,
        customdrawn_common.pas, customdrawn_android.pas and
        customdrawn_winxp.pas: are the Lazarus Custom Drawn Controls -controls
        which imitate the standard LCL ones, but with the difference that they
        are non-native and support skinning.
  - New APIs added to the LCL to improve support of accessibility software
    such as screen readers.
* IDE changes:
  - Many improvments.
  - The detailed list of changes can be found here:
    http://wiki.lazarus.freepascal.org/New_IDE_features_since#v1.0_.282012-08-29.29
    http://wiki.lazarus.freepascal.org/Lazarus_1.0_release_notes#IDE_Changes
* Debugger / Editor changes:
  - Added pascal sources and breakpoints to the disassembler
  - Added threads dialog.
* Components changes:
  - TAChart: many fixes and new features
  - CodeTool: support Delphi style generics and new syntax extensions.
  - AggPas: removed to honor free licencing. (Closes: Bug#708695)
[Bart Martens]
* New debian/watch file fixing issues with upstream RC release.
[Abou Al Montacir]
* Avoid changing files in .pc hidden directory, these are used by quilt for
  internal purpose and could lead to surprises during build.
[Paul Gevers]
* Updated get-orig-source target and it compinion script orig-tar.sh so that they
  repack the source file, allowing bug 708695 to be fixed.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
{ Classes for interpreting the output of svn commands
 
2
 
 
3
  Copyright (C) 2007 Vincent Snijders vincents@freepascal.org
 
4
 
 
5
  This library is free software; you can redistribute it and/or modify it
 
6
  under the terms of the GNU Library General Public License as published by
 
7
  the Free Software Foundation; either version 2 of the License, or (at your
 
8
  option) any later version with the following modification:
 
9
 
 
10
  As a special exception, the copyright holders of this library give you
 
11
  permission to link this library with independent modules to produce an
 
12
  executable, regardless of the license terms of these independent modules,and
 
13
  to copy and distribute the resulting executable under terms of your choice,
 
14
  provided that you also meet, for each linked independent module, the terms
 
15
  and conditions of the license of that module. An independent module is a
 
16
  module which is not derived from or based on this library. If you modify
 
17
  this library, you may extend this exception to your version of the library,
 
18
  but you are not obligated to do so. If you do not wish to do so, delete this
 
19
  exception statement from your version.
 
20
 
 
21
  This program is distributed in the hope that it will be useful, but WITHOUT
 
22
  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 
23
  FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
 
24
  for more details.
 
25
 
 
26
  You should have received a copy of the GNU Library General Public License
 
27
  along with this library; if not, write to the Free Software Foundation,
 
28
  Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
29
}
 
30
unit SvnCommand;
 
31
 
 
32
{$mode objfpc}{$H+}
 
33
 
 
34
interface
 
35
 
 
36
uses
 
37
  Classes, SysUtils,
 
38
  process,
 
39
  FileUtil;
 
40
 
 
41
function ExecuteSvnCommand(const Command: string; Output: TStream): integer;
 
42
function ExecuteSvnCommand(const Command: string): integer;
 
43
procedure DumpStream(const AStream: TStream);
 
44
 
 
45
var
 
46
  SvnExecutable: string;
 
47
 
 
48
implementation
 
49
 
 
50
procedure InitializeSvnExecutable;
 
51
begin
 
52
  if FileExists(SvnExecutable) then exit;
 
53
{$IFDEF windows}
 
54
  SvnExecutable := GetEnvironmentVariable('ProgramFiles') + '\Subversion\bin\svn.exe';
 
55
{$ENDIF}
 
56
  if not FileExists(SvnExecutable) then
 
57
    SvnExecutable := FindDefaultExecutablePath('svn');
 
58
  if not FileExists(SvnExecutable) then
 
59
    raise Exception.Create('No svn executable found');
 
60
end;
 
61
 
 
62
function ExecuteSvnCommand(const Command: string; Output: TStream): integer;
 
63
var
 
64
  SvnProcess: TProcess;
 
65
  
 
66
  function ReadOutput: boolean;
 
67
  // returns true if output was actually read
 
68
  const
 
69
    BufSize = 4096;
 
70
  var
 
71
    Buffer: array[0..BufSize-1] of byte;
 
72
    ReadBytes: integer;
 
73
  begin
 
74
    Result := false;
 
75
    while SvnProcess.Output.NumBytesAvailable>0 do begin
 
76
      ReadBytes := SvnProcess.Output.Read(Buffer, BufSize);
 
77
      Output.Write(Buffer, ReadBytes);
 
78
      Result := true;
 
79
    end;
 
80
  end;
 
81
  
 
82
  function GetOutput: string;
 
83
  begin
 
84
    SetLength(Result, Output.Size);
 
85
    Output.Seek(0,soBeginning);
 
86
    Output.Read(Result[1],Length(Result));
 
87
  end;
 
88
begin
 
89
  if SvnExecutable='' then InitializeSvnExecutable;
 
90
 
 
91
  SvnProcess := TProcess.Create(nil);
 
92
  try
 
93
    SvnProcess.CommandLine := SvnExecutable + ' ' + Command;
 
94
    SvnProcess.Options := [poUsePipes];
 
95
    SvnProcess.ShowWindow := swoHIDE;
 
96
    SvnProcess.Execute;
 
97
    while SvnProcess.Running do begin
 
98
      if not ReadOutput then
 
99
        Sleep(100);
 
100
    end;
 
101
    ReadOutput;
 
102
    Result := SvnProcess.ExitStatus;
 
103
    if Result<>0 then begin
 
104
      Raise Exception.CreateFmt(
 
105
        'svn %s failed: Result %d' + LineEnding + '%s',
 
106
        [Command, Result, GetOutput]);
 
107
    end;
 
108
  finally
 
109
    SvnProcess.Free;
 
110
  end;
 
111
end;
 
112
 
 
113
function ExecuteSvnCommand(const Command: string): integer;
 
114
var
 
115
  Output: TMemoryStream;
 
116
begin
 
117
  Output := TMemoryStream.Create;
 
118
  try
 
119
    Result := ExecuteSvnCommand(Command, Output);
 
120
  finally
 
121
    Output.Free;
 
122
  end;
 
123
end;
 
124
 
 
125
procedure DumpStream(const AStream: TStream);
 
126
var
 
127
  lines: TStrings;
 
128
begin
 
129
  lines := TStringList.Create;
 
130
  AStream.Position := 0;
 
131
  lines.LoadFromStream(AStream);
 
132
  writeln(lines.Text);
 
133
  lines.Free;
 
134
end;
 
135
 
 
136
 
 
137
end.
 
138