KiCad PCB EDA Suite
Loading...
Searching...
No Matches
git_init_handler.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright The KiCad Developers, see AUTHORS.TXT for contributors.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 3
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, you may find one here:
18 * http://www.gnu.org/licenses/gpl-3.0.html
19 * or you may search the http://www.gnu.org website for the version 3 license,
20 * or you may write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
22 */
23
24#include "git_init_handler.h"
25#include "git_backend.h"
28#include <trace_helpers.h>
29#include <set>
30#include <wx/ffile.h>
31#include <wx/filename.h>
32#include <wx/log.h>
33#include <wx/tokenzr.h>
34
35
36// Seed the project .gitignore with KiCad-generated paths that should never be
37// committed (local history, backups, autosaves, lock files, footprint cache,
38// project-local settings which may hold remote URLs and usernames).
39// Append-only: existing entries are preserved.
40static void ensureProjectGitignore( const wxString& aProjectPath )
41{
42 static const wxString kicadEntries[] = {
43 wxS( ".history/" ), wxS( "*-backups/" ), wxS( "_autosave-*" ),
44 wxS( "fp-info-cache" ), wxS( "~*.lck" ), wxS( "*.kicad_prl" ),
45 };
46
47 wxFileName ignoreFile( aProjectPath, wxS( ".gitignore" ) );
48 std::set<wxString> existing;
49 bool fileExists = ignoreFile.FileExists();
50 bool hasTrailingNewline = true;
51
52 if( fileExists )
53 {
54 wxFFile in( ignoreFile.GetFullPath(), wxT( "r" ) );
55 wxString contents;
56
57 if( !in.IsOpened() || !in.ReadAll( &contents ) )
58 return;
59
60 hasTrailingNewline = contents.empty() || contents.EndsWith( wxS( "\n" ) );
61
62 wxStringTokenizer tok( contents, wxS( "\n" ) );
63
64 while( tok.HasMoreTokens() )
65 {
66 wxString line = tok.GetNextToken();
67 line.Trim().Trim( false );
68
69 if( !line.empty() && !line.StartsWith( wxS( "#" ) ) )
70 existing.insert( line );
71 }
72 }
73
74 wxString missing;
75
76 for( const wxString& entry : kicadEntries )
77 {
78 if( existing.find( entry ) == existing.end() )
79 missing += entry + wxS( "\n" );
80 }
81
82 if( missing.empty() )
83 return;
84
85 wxFFile out( ignoreFile.GetFullPath(), wxT( "a" ) );
86
87 if( !out.IsOpened() )
88 return;
89
90 if( !fileExists )
91 out.Write( wxS( "# KiCad-generated files and directories.\n" ) );
92 else if( !hasTrailingNewline )
93 out.Write( wxS( "\n" ) );
94
95 out.Write( missing );
96}
97
98
101
102
105
106
107bool GIT_INIT_HANDLER::IsRepository( const wxString& aPath )
108{
109 return GetGitBackend()->IsRepository( this, aPath );
110}
111
112
114{
116
118 ensureProjectGitignore( aPath );
119
120 return result;
121}
122
123
125{
126 return GetGitBackend()->SetupRemote( this, aConfig );
127}
128
129
130void GIT_INIT_HANDLER::UpdateProgress( int aCurrent, int aTotal, const wxString& aMessage )
131{
132 ReportProgress( aCurrent, aTotal, aMessage );
133}
virtual InitResult InitializeRepository(GIT_INIT_HANDLER *aHandler, const wxString &aPath)=0
virtual bool IsRepository(GIT_INIT_HANDLER *aHandler, const wxString &aPath)=0
virtual bool SetupRemote(GIT_INIT_HANDLER *aHandler, const RemoteConfig &aConfig)=0
bool IsRepository(const wxString &aPath)
Check if a directory is already a git repository.
void UpdateProgress(int aCurrent, int aTotal, const wxString &aMessage) override
GIT_INIT_HANDLER(KIGIT_COMMON *aCommon)
InitResult InitializeRepository(const wxString &aPath)
Initialize a new git repository in the specified directory.
bool SetupRemote(const RemoteConfig &aConfig)
Set up a remote for the repository.
void ReportProgress(int aCurrent, int aTotal, const wxString &aMessage)
KIGIT_REPO_MIXIN(KIGIT_COMMON *aCommon)
GIT_BACKEND * GetGitBackend()
static void ensureProjectGitignore(const wxString &aProjectPath)
InitResult
wxString result
Test unit parsing edge cases and error handling.
wxLogTrace helper definitions.