Anonymous avatar Anonymous committed d36a8f7

git-gui: Allow 'Create New Repository' on existing directories

Often users setup a few source files and get a project rolling
before they create a Git repository for it. In such cases the
core Git tools allow users to initialize a new repository by
simply running `git init` at the desired root level directory.

We need to allow the same situation in git-gui; if the user is
trying to make a new repository we should let them do that to any
location they chose. If the directory already exists and already
has files contained within it we still should allow the user to
create a repository there. However we still need to disallow
creating a repository on top of an existing repository.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>;

Comments (0)

Files changed (1)

lib/choose_repository.tcl

 }
 
 method _git_init {} {
-	if {[file exists $local_path]} {
-		error_popup [mc "Location %s already exists." $local_path]
-		return 0
-	}
-
 	if {[catch {file mkdir $local_path} err]} {
 		error_popup [strcat \
 			[mc "Failed to create repository %s:" $local_path] \
 	if {$p eq {}} return
 
 	set p [file normalize $p]
-	if {[file isdirectory $p]} {
-		foreach i [glob \
-			-directory $p \
-			-tails \
-			-nocomplain \
-			* .*] {
-			switch -- $i {
-			 . continue
-			.. continue
-			default {
-				error_popup [mc "Directory %s already exists." $p]
-				return
-			}
-			}
-		}
-		if {[catch {file delete $p} err]} {
-			error_popup [strcat \
-				[mc "Directory %s already exists." $p] \
-				"\n\n$err"]
-			return
-		}
-	} elseif {[file exists $p]} {
-		error_popup [mc "File %s already exists." $p]
+	if {![_new_ok $p]} {
 		return
 	}
 	set local_path $p
 }
 
 method _do_new2 {} {
+	if {![_new_ok $local_path]} {
+		return
+	}
 	if {![_git_init $this]} {
 		return
 	}
 	set done 1
 }
 
+proc _new_ok {p} {
+	if {[file isdirectory $p]} {
+		if {[_is_git [file join $p .git]]} {
+			error_popup [mc "Directory %s already exists." $p]
+			return 0
+		}
+	} elseif {[file exists $p]} {
+		error_popup [mc "File %s already exists." $p]
+		return 0
+	}
+	return 1
+}
+
 ######################################################################
 ##
 ## Clone Existing Repository
 		}
 	}
 
+	if {[file exists $local_path]} {
+		error_popup [mc "Location %s already exists." $local_path]
+		return
+	}
+
 	if {![_git_init $this]} return
 	set local_path [pwd]
 
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.