- Timestamp:
- Apr 5, 2025, 9:45:07 PM (4 days ago)
- Location:
- trunk
- Files:
-
- 1 added
- 2 deleted
- 17 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Backends/Bazaar/Bazaar.pas
r23 r24 24 24 procedure Update; override; 25 25 procedure CleanUp; override; 26 procedure Commit(Message: TStrings); override;26 procedure Commit(Message: string); override; 27 27 procedure Move(Source, Dest: string); override; 28 28 procedure Merge; override; … … 77 77 end; 78 78 79 procedure TBazaar.Commit(Message: TStrings);79 procedure TBazaar.Commit(Message: string); 80 80 begin 81 Execute(['commit', '-m "' + Message .Text+ '"']);81 Execute(['commit', '-m "' + Message + '"']); 82 82 end; 83 83 -
trunk/Backends/CVS/CVS.pas
r23 r24 25 25 procedure Update; override; 26 26 procedure CleanUp; override; 27 procedure Commit(Message: TStrings); override;27 procedure Commit(Message: string); override; 28 28 procedure Move(Source, Dest: string); override; 29 29 procedure Merge; override; 30 30 procedure Add(FileName: string); override; 31 31 procedure Remove(FileName: string); override; 32 procedure GetStatus(FileName: string; Status: TFileStatus List); override;32 procedure GetStatus(FileName: string; Status: TFileStatuses); override; 33 33 end; 34 34 … … 95 95 end; 96 96 97 procedure TCVS.Commit(Message: TStrings);97 procedure TCVS.Commit(Message: string); 98 98 begin 99 Execute(['commit', '-m "' + Message .Text+ '"']);99 Execute(['commit', '-m "' + Message + '"']); 100 100 end; 101 101 … … 124 124 end; 125 125 126 procedure TCVS.GetStatus(FileName: string; Status: TFileStatus List);126 procedure TCVS.GetStatus(FileName: string; Status: TFileStatuses); 127 127 begin 128 128 Status.Clear; -
trunk/Backends/Git/Git.pas
r23 r24 25 25 procedure Update; override; 26 26 procedure CleanUp; override; 27 procedure Commit(Message: TStrings); override;27 procedure Commit(Message: string); override; 28 28 procedure Move(Source, Dest: string); override; 29 29 procedure Merge; override; 30 30 procedure Add(FileName: string); override; 31 procedure GetLog(FileName: string; Log: TLog List); override;31 procedure GetLog(FileName: string; Log: TLogItems); override; 32 32 end; 33 33 … … 93 93 end; 94 94 95 procedure TGit.Commit(Message: TStrings);95 procedure TGit.Commit(Message: string); 96 96 begin 97 97 Execute(['config', 'user.name "' + UserName + '"']); 98 98 Execute(['config', 'user.email "' + Email + '"']); 99 Execute(['commit', '-m "' + Message .Text+ '"']);99 Execute(['commit', '-m "' + Message + '"']); 100 100 end; 101 101 … … 115 115 end; 116 116 117 procedure TGit.GetLog(FileName: string; Log: TLog List);117 procedure TGit.GetLog(FileName: string; Log: TLogItems); 118 118 begin 119 119 end; -
trunk/Backends/Subversion/Subversion.pas
r23 r24 25 25 procedure Update; override; 26 26 procedure CleanUp; override; 27 procedure Commit(Message: TStrings); override;27 procedure Commit(Message: string); override; 28 28 procedure Move(Source, Dest: string); override; 29 29 procedure Merge; override; 30 30 procedure Add(FileName: string); override; 31 31 procedure Remove(FileName: string); override; 32 procedure GetLog(FileName: string; Log: TLog List); override;33 procedure GetStatus(FileName: string; Status: TFileStatus List); override;32 procedure GetLog(FileName: string; Log: TLogItems); override; 33 procedure GetStatus(FileName: string; Status: TFileStatuses); override; 34 34 end; 35 35 … … 116 116 end; 117 117 118 procedure TSubversion.Commit(Message: TStrings);119 begin 120 Execute(['commit', '-m "' + Message .Text+ '"']);118 procedure TSubversion.Commit(Message: string); 119 begin 120 Execute(['commit', '-m "' + Message + '"']); 121 121 end; 122 122 … … 141 141 end; 142 142 143 procedure TSubversion.GetLog(FileName: string; Log: TLog List);143 procedure TSubversion.GetLog(FileName: string; Log: TLogItems); 144 144 var 145 145 NewItem: TLogItem; … … 184 184 end; 185 185 186 procedure TSubversion.GetStatus(FileName: string; Status: TFileStatus List);186 procedure TSubversion.GetStatus(FileName: string; Status: TFileStatuses); 187 187 var 188 188 Doc: TXMLDocument; 189 189 S: TStringStream; 190 190 Node: TDOMNode; 191 Node2: TDOMNode;192 191 RootNode: TDOMNode; 193 192 TargetNode: TDOMNode; -
trunk/Core.pas
r23 r24 5 5 uses 6 6 Classes, SysUtils, XMLConf, LazFileUtils, ActnList, Controls, VCS, Project, 7 LastOpenedList, Forms, Dialogs, Menus, Generics.Collections, Backend, FormMain; 7 LastOpenedList, Forms, Dialogs, Menus, Backend, 8 FormMain; 8 9 9 10 type … … 65 66 function DetectBackend(Directory: string): TBackend; 66 67 public 67 Backends: T List<TBackend>;68 Backends: TBackends; 68 69 Project: TProject; 69 70 ProjectGroup: TProjectGroup; … … 88 89 89 90 uses 90 FormBrowse, FormSettings, FormCommit, FormCheckout, 91 Subversion, Bazaar, CVS, Git, Form Test, FormProjectGroup;91 FormBrowse, FormSettings, FormCommit, FormCheckout, FormTests, 92 Subversion, Bazaar, CVS, Git, FormProjectGroup, Test; 92 93 93 94 { TCore } … … 140 141 141 142 procedure TCore.AViewTestExecute(Sender: TObject); 142 var 143 FormTest: TFormTest; 144 begin 145 FormTest := TFormTest.Create(nil); 146 try 147 FormTest.Show; 148 finally 149 FormTest.Free; 150 end; 143 begin 144 with TFormTests.Create(nil) do 145 try 146 TestCases := InitTestCases; 147 try 148 ShowModal; 149 finally 150 TestCases.Free; 151 end; 152 finally 153 Free; 154 end; 151 155 end; 152 156 153 157 procedure TCore.DataModuleCreate(Sender: TObject); 154 158 begin 155 Backends := T List<TBackend>.Create;159 Backends := TBackends.Create; 156 160 Project := nil; 157 161 … … 203 207 begin 204 208 I := 0; 205 while (I < Backends.Count) and (not TBackend(Backends[I]).IsWorkingCopy(Directory)) do Inc(I);206 if I < Backends.Count then Result := TBackend(Backends[I])209 while (I < Backends.Count) and (not Backends[I].IsWorkingCopy(Directory)) do Inc(I); 210 if I < Backends.Count then Result := Backends[I] 207 211 else Result := nil; 208 212 end; … … 233 237 RegisterBackends; 234 238 XMLConfig1.Filename := GetAppConfigDir(False) + 'Config.xml'; 235 ForceDirectories UTF8(ExtractFileDir(XMLConfig1.Filename));239 ForceDirectories(ExtractFileDir(XMLConfig1.Filename)); 236 240 LoadConfig; 237 if (LastOpenedListProject.Items.Count > 0) and DirectoryExists UTF8(LastOpenedListProject.Items[0]) then241 if (LastOpenedListProject.Items.Count > 0) and DirectoryExists(LastOpenedListProject.Items[0]) then 238 242 ProjectOpen(LastOpenedListProject.Items[0]); 239 243 end; … … 327 331 procedure TCore.AProjectGroupSaveExecute(Sender: TObject); 328 332 begin 329 if FileExists UTF8(ProjectGroup.FileName) then ProjectGroup.SaveToFile(ProjectGroup.FileName)333 if FileExists(ProjectGroup.FileName) then ProjectGroup.SaveToFile(ProjectGroup.FileName) 330 334 else AProjectGroupSaveAs.Execute; 331 335 end; … … 378 382 try 379 383 if FormCommit.ShowModal = mrOk then begin 380 Project.WorkingCopy.Commit(FormCommit.MemoMessage.Lines );384 Project.WorkingCopy.Commit(FormCommit.MemoMessage.Lines.Text); 381 385 end; 382 386 finally -
trunk/Forms/FormBrowse.pas
r23 r24 5 5 uses 6 6 Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ComCtrls, 7 ExtCtrls, Menus, ActnList, FindFile, VCS, Generics.Collections,LazFileUtils;7 ExtCtrls, Menus, ActnList, FindFile, VCS, LazFileUtils; 8 8 9 9 type … … 45 45 Selected: Boolean); 46 46 private 47 FileList: TFileStatus List;47 FileList: TFileStatuses; 48 48 public 49 49 Directory: string; … … 118 118 ReloadList; 119 119 end else 120 if DirectoryExists UTF8(Directory + DirectorySeparator + Caption) then begin120 if DirectoryExists(Directory + DirectorySeparator + Caption) then begin 121 121 Directory := Directory + DirectorySeparator + ListView1.Selected.Caption; 122 122 ReloadList; … … 129 129 NewName: string; 130 130 begin 131 NewName := ''; 131 132 if InputQuery('Rename', 'Enter new name', NewName) then 132 133 Core.Core.Project.WorkingCopy.Move(Directory + DirectorySeparator + ListView1.Selected.Caption, NewName); … … 135 136 procedure TFormBrowse.FormCreate(Sender: TObject); 136 137 begin 137 FileList := TFileStatus List.Create;138 FileList := TFileStatuses.Create; 138 139 end; 139 140 … … 153 154 FoundFileList: TStrings; 154 155 I: Integer; 155 FileStatusList: TFileStatus List;156 FileStatusList: TFileStatuses; 156 157 NewFileItem: TFileStatus; 157 158 FS: TFileStatus; … … 160 161 FileList.Clear; 161 162 if Assigned(Core.Core.Project) then begin 162 FileStatusList := TFileStatus List.Create;163 FileStatusList := TFileStatuses.Create; 163 164 try 164 165 Core.Core.Project.WorkingCopy.GetStatus(Directory, FileStatusList); 165 166 166 if DirectoryExists UTF8(Directory) then begin167 if DirectoryExists(Directory) then begin 167 168 FindFile := TFindFile.Create(nil); 168 169 try -
trunk/Forms/FormConsole.pas
r23 r24 88 88 Line: string; 89 89 CommandLine: string; 90 I: Integer;91 90 begin 92 91 Text := ''; -
trunk/Forms/FormLog.pas
r23 r24 27 27 public 28 28 FileName: string; 29 LogList: TLog List;29 LogList: TLogItems; 30 30 procedure ReloadList; 31 31 procedure UpdateInterface; … … 44 44 procedure TFormLog.FormCreate(Sender: TObject); 45 45 begin 46 LogList := TLog List.Create;46 LogList := TLogItems.Create; 47 47 end; 48 48 -
trunk/Forms/FormMain.lfm
r23 r24 1 1 object FormMain: TFormMain 2 2 Left = 687 3 Height = 7 673 Height = 733 4 4 Top = 411 5 5 Width = 1408 6 6 Caption = 'VCSCommander' 7 ClientHeight = 7 677 ClientHeight = 733 8 8 ClientWidth = 1408 9 9 DesignTimePPI = 144 … … 45 45 Left = 0 46 46 Height = 28 47 Top = 7 3947 Top = 705 48 48 Width = 1408 49 49 Panels = <> -
trunk/Languages/VCSCommander.cs.po
r23 r24 18 18 msgstr "ŠpatnÜ formát souboru" 19 19 20 #: test.sexpected 21 msgid "Expected:" 22 msgstr "" 23 24 #: test.sexport 25 msgid "Export:" 26 msgstr "" 27 28 #: test.soutput 29 msgid "Output:" 30 msgstr "" 31 -
trunk/Languages/VCSCommander.pot
r23 r24 7 7 msgstr "" 8 8 9 #: test.sexpected 10 msgid "Expected:" 11 msgstr "" 12 13 #: test.sexport 14 msgid "Export:" 15 msgstr "" 16 17 #: test.soutput 18 msgid "Output:" 19 msgstr "" 20 -
trunk/Packages/Common/Translator.pas
r21 r24 482 482 483 483 Result := ChangeFileExt(ParamStr(0), LCExt); 484 if FileExists UTF8(Result) then484 if FileExists(Result) then 485 485 Exit; 486 486 … … 500 500 Result := ExtractFilePath(ParamStrUTF8(0)) + LangID + 501 501 DirectorySeparator + ChangeFileExt(ExtractFileName(ParamStrUTF8(0)), LCExt); 502 if FileExists UTF8(Result) then502 if FileExists(Result) then 503 503 exit; 504 504 505 505 Result := ExtractFilePath(ParamStrUTF8(0)) + 'languages' + DirectorySeparator + LangID + 506 506 DirectorySeparator + ChangeFileExt(ExtractFileName(ParamStrUTF8(0)), LCExt); 507 if FileExists UTF8(Result) then507 if FileExists(Result) then 508 508 exit; 509 509 510 510 Result := ExtractFilePath(ParamStrUTF8(0)) + 'locale' + DirectorySeparator 511 511 + LangID + DirectorySeparator + ChangeFileExt(ExtractFileName(ParamStrUTF8(0)), LCExt); 512 if FileExists UTF8(Result) then512 if FileExists(Result) then 513 513 exit; 514 514 … … 516 516 + LangID + DirectorySeparator + 'LC_MESSAGES' + DirectorySeparator + 517 517 ChangeFileExt(ExtractFileName(ParamStrUTF8(0)), LCExt); 518 if FileExists UTF8(Result) then518 if FileExists(Result) then 519 519 exit; 520 520 … … 523 523 Result := '/usr/share/locale/' + LangID + '/LC_MESSAGES/' + 524 524 ChangeFileExt(ExtractFileName(ParamStrUTF8(0)), LCExt); 525 if FileExists UTF8(Result) then525 if FileExists(Result) then 526 526 exit; 527 527 {$ENDIF} … … 531 531 Result := ExtractFilePath(ParamStrUTF8(0)) + LangShortID + 532 532 DirectorySeparator + ChangeFileExt(ExtractFileName(ParamStrUTF8(0)), LCExt); 533 if FileExists UTF8(Result) then533 if FileExists(Result) then 534 534 exit; 535 535 … … 537 537 LangShortID + DirectorySeparator + ChangeFileExt( 538 538 ExtractFileName(ParamStrUTF8(0)), LCExt); 539 if FileExists UTF8(Result) then539 if FileExists(Result) then 540 540 exit; 541 541 … … 543 543 + LangShortID + DirectorySeparator + ChangeFileExt( 544 544 ExtractFileName(ParamStrUTF8(0)), LCExt); 545 if FileExists UTF8(Result) then545 if FileExists(Result) then 546 546 exit; 547 547 … … 549 549 + LangShortID + DirectorySeparator + 'LC_MESSAGES' + DirectorySeparator + 550 550 ChangeFileExt(ExtractFileName(ParamStrUTF8(0)), LCExt); 551 if FileExists UTF8(Result) then551 if FileExists(Result) then 552 552 exit; 553 553 … … 556 556 try 557 557 Result := ExtractFilePath(ParamStrUTF8(0)) + ChangeFileExt(ExtractFileName(ParamStrUTF8(0)), Format(FormatLang, [LangID])) + LCExt; 558 if FileExists UTF8(Result) then558 if FileExists(Result) then 559 559 exit; 560 560 // Common location (like in Lazarus) 561 561 Result := ExtractFilePath(ParamStrUTF8(0)) + 'locale' + DirectorySeparator + 562 562 ChangeFileExt(ExtractFileName(ParamStrUTF8(0)), Format(FormatLang, [LangID])) + LCExt; 563 if FileExists UTF8(Result) then563 if FileExists(Result) then 564 564 exit; 565 565 566 566 Result := ExtractFilePath(ParamStrUTF8(0)) + 'languages' + 567 567 DirectorySeparator + ChangeFileExt(ExtractFileName(ParamStrUTF8(0)), Format(FormatLang, [LangID])) + LCExt; 568 if FileExists UTF8(Result) then568 if FileExists(Result) then 569 569 exit; 570 570 except … … 575 575 Result := '/usr/share/locale/' + LangShortID + '/LC_MESSAGES/' + 576 576 ChangeFileExt(ExtractFileName(ParamStrUTF8(0)), LCExt); 577 if FileExists UTF8(Result) then577 if FileExists(Result) then 578 578 exit; 579 579 {$ENDIF} 580 580 Result := ExtractFilePath(ParamStrUTF8(0)) + ChangeFileExt( 581 581 ExtractFileName(ParamStrUTF8(0)), Format(FormatLang, [LangShortID])) + LCExt; 582 if FileExists UTF8(Result) then582 if FileExists(Result) then 583 583 exit; 584 584 585 585 Result := ExtractFilePath(ParamStrUTF8(0)) + 'locale' + DirectorySeparator + 586 586 ChangeFileExt(ExtractFileName(ParamStrUTF8(0)), Format(FormatLang, [LangShortID])) + LCExt; 587 if FileExists UTF8(Result) then587 if FileExists(Result) then 588 588 exit; 589 589 590 590 Result := ExtractFilePath(ParamStrUTF8(0)) + 'languages' + DirectorySeparator + 591 591 ChangeFileExt(ExtractFileName(ParamStrUTF8(0)), Format(FormatLang, [LangShortID])) + LCExt; 592 if FileExists UTF8(Result) then592 if FileExists(Result) then 593 593 exit; 594 594 end; -
trunk/Units/Backend.pas
r23 r24 4 4 5 5 uses 6 Classes, SysUtils, VCS ;6 Classes, SysUtils, VCS, Generics.Collections; 7 7 8 8 type … … 19 19 function IsRepository(Directory: string): Boolean; virtual; 20 20 function IsWorkingCopy(Directory: string): Boolean; virtual; 21 end; 22 23 TBackends = class(TList<TBackend>) 21 24 end; 22 25 -
trunk/Units/Project.pas
r23 r24 80 80 NewNode := Node.OwnerDocument.CreateElement('Project'); 81 81 Node.AppendChild(NewNode); 82 TProject(Items[I]).SaveXMLNode(NewNode);82 Items[I].SaveXMLNode(NewNode); 83 83 end; 84 84 end; … … 136 136 Projects.SaveXMLNode(NewNode); 137 137 end; 138 ForceDirectories UTF8(ExtractFileDir(FileName));139 WriteXMLFile(Doc, UTF8Decode(FileName));138 ForceDirectories(ExtractFileDir(FileName)); 139 WriteXMLFile(Doc, FileName); 140 140 finally 141 141 Doc.Free; -
trunk/Units/VCS.pas
r23 r24 21 21 end; 22 22 23 TLog List= class(TObjectList<TLogItem>)23 TLogItems = class(TObjectList<TLogItem>) 24 24 end; 25 25 … … 37 37 end; 38 38 39 { TFileStatus List}40 41 TFileStatus List= class(TObjectList<TFileStatus>)39 { TFileStatuses } 40 41 TFileStatuses = class(TObjectList<TFileStatus>) 42 42 function SearchByName(Name: string): TFileStatus; 43 43 end; … … 64 64 procedure Update; virtual; 65 65 procedure CleanUp; virtual; 66 procedure Commit(Message: TStrings); virtual;66 procedure Commit(Message: string); virtual; 67 67 procedure Move(Source, Dest: string); virtual; 68 68 procedure Merge; virtual; … … 70 70 procedure Add(FileName: string); virtual; 71 71 procedure Remove(FileName: string); virtual; 72 procedure GetLog(FileName: string; Log: TLog List); virtual;73 procedure GetStatus(FileName: string; Status: TFileStatus List); virtual;72 procedure GetLog(FileName: string; Log: TLogItems); virtual; 73 procedure GetStatus(FileName: string; Status: TFileStatuses); virtual; 74 74 constructor Create; 75 75 destructor Destroy; override; … … 86 86 ExecutionOutput: TStringList; 87 87 Path: string; 88 SilentExecution: Boolean; 88 89 procedure Init; virtual; 89 90 constructor Create; … … 106 107 begin 107 108 Result := DirName; 108 if Relative then Result := GetCurrentDir UTF8+ DirectorySeparator + Result;109 if Relative then Result := GetCurrentDir + DirectorySeparator + Result; 109 110 Result := 'file:///' + StringReplace(Result, DirectorySeparator, '/', [rfReplaceAll]); 110 111 end; … … 121 122 end; 122 123 123 { TFileStatus List}124 125 function TFileStatus List.SearchByName(Name: string): TFileStatus;124 { TFileStatuses } 125 126 function TFileStatuses.SearchByName(Name: string): TFileStatus; 126 127 var 127 128 I: Integer; … … 145 146 FormConsole.Parameters.Clear; 146 147 FormConsole.Parameters.AddStrings(Parameters); 147 if DirectoryExists UTF8(Path) then FormConsole.WorkingDir := Path148 if DirectoryExists(Path) then FormConsole.WorkingDir := Path 148 149 else FormConsole.WorkingDir := ''; 149 FormConsole.ShowModal; 150 if SilentExecution then FormConsole.Perform 151 else FormConsole.ShowModal; 150 152 ExecutionOutput.Assign(FormConsole.Log); 151 153 finally … … 156 158 procedure TRepository.Init; 157 159 begin 158 159 160 end; 160 161 … … 211 212 FormConsole.Parameters.Clear; 212 213 FormConsole.Parameters.AddStrings(Parameters); 213 if DirectoryExists UTF8(Path) then FormConsole.WorkingDir := Path214 if DirectoryExists(Path) then FormConsole.WorkingDir := Path 214 215 else FormConsole.WorkingDir := ''; 215 216 if SilentExecution then FormConsole.Perform … … 234 235 procedure TWorkingCopy.Checkout; 235 236 begin 236 237 237 end; 238 238 239 239 procedure TWorkingCopy.Update; 240 240 begin 241 242 241 end; 243 242 244 243 procedure TWorkingCopy.CleanUp; 245 244 begin 246 247 end; 248 249 procedure TWorkingCopy.Commit(Message: TStrings); 250 begin 251 245 end; 246 247 procedure TWorkingCopy.Commit(Message: string); 248 begin 252 249 end; 253 250 254 251 procedure TWorkingCopy.Move(Source, Dest: string); 255 252 begin 256 257 253 end; 258 254 259 255 procedure TWorkingCopy.Merge; 260 256 begin 261 262 257 end; 263 258 264 259 procedure TWorkingCopy.Refresh; 265 260 begin 266 267 261 end; 268 262 269 263 procedure TWorkingCopy.Add(FileName: string); 270 264 begin 271 272 265 end; 273 266 274 267 procedure TWorkingCopy.Remove(FileName: string); 275 268 begin 276 277 end; 278 279 procedure TWorkingCopy.GetLog(FileName: string; Log: TLogList); 269 end; 270 271 procedure TWorkingCopy.GetLog(FileName: string; Log: TLogItems); 280 272 begin 281 273 Log.Clear; 282 274 end; 283 275 284 procedure TWorkingCopy.GetStatus(FileName: string; Status: TFileStatus List);276 procedure TWorkingCopy.GetStatus(FileName: string; Status: TFileStatuses); 285 277 begin 286 278 Status.Clear; -
trunk/VCSCommander.lpi
r23 r24 189 189 </Unit16> 190 190 <Unit17> 191 <Filename Value="Forms/Form Test.pas"/>192 <IsPartOfProject Value="True"/> 193 <ComponentName Value="Form Test"/>191 <Filename Value="Forms/FormProjectGroup.pas"/> 192 <IsPartOfProject Value="True"/> 193 <ComponentName Value="FormProjectGroup"/> 194 194 <HasResources Value="True"/> 195 195 <ResourceBaseClass Value="Form"/> 196 196 </Unit17> 197 197 <Unit18> 198 <Filename Value="Forms/FormProjectGroup.pas"/> 199 <IsPartOfProject Value="True"/> 200 <ComponentName Value="FormProjectGroup"/> 201 <HasResources Value="True"/> 202 <ResourceBaseClass Value="Form"/> 198 <Filename Value="Test.pas"/> 199 <IsPartOfProject Value="True"/> 203 200 </Unit18> 204 201 </Units> -
trunk/VCSCommander.lpr
r23 r24 8 8 Forms, FormMain, Core, Common, FormBrowse, VCS, 9 9 FormFavorites, FormSettings, FormConsole, Subversion, Project, SysUtils, 10 FormCommit, FormCheckout, Bazaar, Backend, FormLog, FormTest,11 FormProjectGroup 10 FormCommit, FormCheckout, Bazaar, Backend, FormLog, 11 FormProjectGroup, Test 12 12 { you can add units after this }; 13 13
Note:
See TracChangeset
for help on using the changeset viewer.