1 | unit Project;
|
---|
2 |
|
---|
3 | interface
|
---|
4 |
|
---|
5 | uses
|
---|
6 | Classes, SysUtils, VCS, Backend, Generics.Collections, DOM, XMLRead, XMLWrite,
|
---|
7 | XML, LazFileUtils;
|
---|
8 |
|
---|
9 | type
|
---|
10 |
|
---|
11 | { TProject }
|
---|
12 |
|
---|
13 | TProject = class
|
---|
14 | private
|
---|
15 | FBackend: TBackend;
|
---|
16 | function GetDirectory: string;
|
---|
17 | function GetRepositoryURL: string;
|
---|
18 | procedure SetDirectory(AValue: string);
|
---|
19 | procedure SetRepositoryURL(AValue: string);
|
---|
20 | procedure SetBackend(AValue: TBackend);
|
---|
21 | public
|
---|
22 | WorkingCopy: TWorkingCopy;
|
---|
23 | Repository: TRepository;
|
---|
24 | procedure Open(Directory: string);
|
---|
25 | constructor Create;
|
---|
26 | destructor Destroy; override;
|
---|
27 | procedure LoadXMLNOde(Node: TDOMNode);
|
---|
28 | procedure SaveXMLNOde(Node: TDOMNode);
|
---|
29 | property Backend: TBackend read FBackend write SetBackend;
|
---|
30 | property Directory: string read GetDirectory write SetDirectory;
|
---|
31 | property RepositoryURL: string read GetRepositoryURL write SetRepositoryURL;
|
---|
32 | end;
|
---|
33 |
|
---|
34 | { TProjects }
|
---|
35 |
|
---|
36 | TProjects = class(TObjectList<TProject>)
|
---|
37 | procedure LoadXMLNode(Node: TDOMNode);
|
---|
38 | procedure SaveXMLNode(Node: TDOMNode);
|
---|
39 | end;
|
---|
40 |
|
---|
41 | { TProjectGroup }
|
---|
42 |
|
---|
43 | TProjectGroup = class
|
---|
44 | FileName: string;
|
---|
45 | Projects: TProjects;
|
---|
46 | constructor Create;
|
---|
47 | destructor Destroy; override;
|
---|
48 | procedure LoadFromFile(FileName: string);
|
---|
49 | procedure SaveToFile(FileName: string);
|
---|
50 | end;
|
---|
51 |
|
---|
52 |
|
---|
53 | implementation
|
---|
54 |
|
---|
55 | resourcestring
|
---|
56 | SWrongFileFormat = 'Wrong file format';
|
---|
57 |
|
---|
58 | { TProjects }
|
---|
59 |
|
---|
60 | procedure TProjects.LoadXMLNode(Node: TDOMNode);
|
---|
61 | var
|
---|
62 | NewProject: TProject;
|
---|
63 | Node2: TDOMNode;
|
---|
64 | begin
|
---|
65 | Node2 := Node.FirstChild;
|
---|
66 | while Assigned(Node2) and (Node2.NodeName = 'Project') do begin
|
---|
67 | NewProject := TProject.Create;
|
---|
68 | NewProject.LoadXMLNode(Node2);
|
---|
69 | Add(NewProject);
|
---|
70 | Node2 := Node2.NextSibling;
|
---|
71 | end;
|
---|
72 | end;
|
---|
73 |
|
---|
74 | procedure TProjects.SaveXMLNode(Node: TDOMNode);
|
---|
75 | var
|
---|
76 | I: Integer;
|
---|
77 | NewNode: TDOMNode;
|
---|
78 | begin
|
---|
79 | for I := 0 to Count - 1 do begin;
|
---|
80 | NewNode := Node.OwnerDocument.CreateElement('Project');
|
---|
81 | Node.AppendChild(NewNode);
|
---|
82 | Items[I].SaveXMLNode(NewNode);
|
---|
83 | end;
|
---|
84 | end;
|
---|
85 |
|
---|
86 | { TProjectGroup }
|
---|
87 |
|
---|
88 | constructor TProjectGroup.Create;
|
---|
89 | begin
|
---|
90 | Projects := TProjects.Create;
|
---|
91 | end;
|
---|
92 |
|
---|
93 | destructor TProjectGroup.Destroy;
|
---|
94 | begin
|
---|
95 | FreeAndNil(Projects);
|
---|
96 | inherited;
|
---|
97 | end;
|
---|
98 |
|
---|
99 | procedure TProjectGroup.LoadFromFile(FileName: string);
|
---|
100 | var
|
---|
101 | Doc: TXMLDocument;
|
---|
102 | RootNode: TDOMNode;
|
---|
103 | Node: TDOMNode;
|
---|
104 | Node2: TDOMNode;
|
---|
105 | begin
|
---|
106 | Self.FileName := FileName;
|
---|
107 | ReadXMLFile(Doc, UTF8Decode(FileName));
|
---|
108 | with Doc do try
|
---|
109 | if Doc.DocumentElement.NodeName <> 'ProjectGroup' then
|
---|
110 | raise Exception.Create(SWrongFileFormat);
|
---|
111 | RootNode := Doc.DocumentElement;
|
---|
112 | with RootNode do begin
|
---|
113 | Node := FindNode('Projects');
|
---|
114 | if Assigned(Node) then Projects.LoadXMLNode(Node);
|
---|
115 | end;
|
---|
116 | finally
|
---|
117 | Doc.Free;
|
---|
118 | end;
|
---|
119 | end;
|
---|
120 |
|
---|
121 | procedure TProjectGroup.SaveToFile(FileName: string);
|
---|
122 | var
|
---|
123 | NewNode: TDOMNode;
|
---|
124 | Doc: TXMLDocument;
|
---|
125 | RootNode: TDOMNode;
|
---|
126 | begin
|
---|
127 | if FileName = '' then Exit;
|
---|
128 | Self.FileName := FileName;
|
---|
129 | Doc := TXMLDocument.Create;
|
---|
130 | with Doc do try
|
---|
131 | RootNode := CreateElement('ProjectGroup');
|
---|
132 | AppendChild(RootNode);
|
---|
133 | with RootNode do begin
|
---|
134 | NewNode := OwnerDocument.CreateElement('Projects');
|
---|
135 | AppendChild(NewNode);
|
---|
136 | Projects.SaveXMLNode(NewNode);
|
---|
137 | end;
|
---|
138 | ForceDirectories(ExtractFileDir(FileName));
|
---|
139 | WriteXMLFile(Doc, FileName);
|
---|
140 | finally
|
---|
141 | Doc.Free;
|
---|
142 | end;
|
---|
143 | end;
|
---|
144 |
|
---|
145 | { TProject }
|
---|
146 |
|
---|
147 | procedure TProject.SetBackend(AValue: TBackend);
|
---|
148 | begin
|
---|
149 | if FBackend = AValue then Exit;
|
---|
150 | FBackend := AValue;
|
---|
151 | FreeAndNil(WorkingCopy);
|
---|
152 | WorkingCopy := AValue.WorkingCopyClass.Create;
|
---|
153 | FreeAndNil(Repository);
|
---|
154 | Repository := AValue.RepositoryClass.Create;
|
---|
155 | end;
|
---|
156 |
|
---|
157 | function TProject.GetDirectory: string;
|
---|
158 | begin
|
---|
159 | Result := WorkingCopy.Path;
|
---|
160 | end;
|
---|
161 |
|
---|
162 | function TProject.GetRepositoryURL: string;
|
---|
163 | begin
|
---|
164 | Result := WorkingCopy.RepositoryURL;
|
---|
165 | end;
|
---|
166 |
|
---|
167 | procedure TProject.SetDirectory(AValue: string);
|
---|
168 | begin
|
---|
169 | WorkingCopy.Path := AValue;
|
---|
170 | end;
|
---|
171 |
|
---|
172 | procedure TProject.SetRepositoryURL(AValue: string);
|
---|
173 | begin
|
---|
174 | WorkingCopy.RepositoryURL := AValue;
|
---|
175 | Repository.Path := AValue;
|
---|
176 | end;
|
---|
177 |
|
---|
178 | procedure TProject.Open(Directory: string);
|
---|
179 | begin
|
---|
180 | WorkingCopy.Path := Directory;
|
---|
181 | end;
|
---|
182 |
|
---|
183 | constructor TProject.Create;
|
---|
184 | begin
|
---|
185 | WorkingCopy := TWorkingCopy.Create;
|
---|
186 | Repository := TRepository.Create;
|
---|
187 | end;
|
---|
188 |
|
---|
189 | destructor TProject.Destroy;
|
---|
190 | begin
|
---|
191 | FreeAndNil(WorkingCopy);
|
---|
192 | FreeAndNil(Repository);
|
---|
193 | inherited;
|
---|
194 | end;
|
---|
195 |
|
---|
196 | procedure TProject.LoadXMLNOde(Node: TDOMNode);
|
---|
197 | begin
|
---|
198 | RepositoryURL := ReadString(Node, 'RepositoryURL', '');
|
---|
199 | Directory := ReadString(Node, 'Directory', '');
|
---|
200 | end;
|
---|
201 |
|
---|
202 | procedure TProject.SaveXMLNOde(Node: TDOMNode);
|
---|
203 | begin
|
---|
204 | WriteString(Node, 'RepositoryURL', RepositoryURL);
|
---|
205 | WriteString(Node, 'Directory', Directory);
|
---|
206 | end;
|
---|
207 |
|
---|
208 | end.
|
---|
209 |
|
---|